Можно ли использовать Jetpack Compose во Flutter, используя представления платформы? ⇐ Android
-
Anonymous
Можно ли использовать Jetpack Compose во Flutter, используя представления платформы?
Я столкнулся с проблемой при интеграции Android Jetpack Compose во Flutter с использованием представления платформы, предоставляемого Flutter.
java.lang.NoSuchMethodError: нет виртуального метода setContent(Lkotlin/jvm/functions/Function0;)V в классе Landroidx/compose/ui/platform/ComposeView; или его суперклассы (объявление androidx.compose.ui.platform.ComposeView появляется в /data/app/~~jNPuLsqJ5chFROaeevr0TQ==/com.example.example-_A0JqLOSwN-L0KrftRNktw==/base.apk)
импортировать android.content.Context импортировать android.graphics.Color импортировать android.view.View импортировать android.view.ViewGroup импортировать android.widget.TextView импортировать androidx.compose.material3.Text импортировать androidx.compose.runtime.Composable импортировать androidx.compose.ui.platform.ComposeView импортировать androidx.constraintlayout.widget.ConstraintLayout импортировать androidx.constraintlayout.widget.ConstraintSet импортировать io.flutter.embedding.android.FlutterFragmentActivity импортировать io.flutter.embedding.engine.FlutterEngine импортировать io.flutter.plugin.common.StandardMessageCodec импортировать io.flutter.plugin.platform.PlatformView импортировать io.flutter.plugin.platform.PlatformViewFactory класс MainActivity: FlutterFragmentActivity() { переопределить удовольствие configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) флаттерДвигатель .platformViewsController .регистрация .registerViewFactory("flutter_native_example", MyComposeViewFactory()) } } класс MyComposeViewFactory: PlatformViewFactory(StandardMessageCodec.INSTANCE) { переопределить fun create(context: Context, viewId: Int, args: Any?): ПлатформаВью { val CreationParams = args as Map? вернуть MyComposeView (контекст, viewId, CreationParams) } } класс MyComposeView(контекст: Context, id: Int, CreationParams: Map?) : PlatformView { частное ограничениеLayout: ConstraintLayout частный val textView: TextView частный val composeView: ComposeView переопределить удовольствие getView(): View { ограничение возвратаLayout } в этом { ограничениеLayout = ConstraintLayout(контекст) textView = TextView(контекст) composeView = ComposeView(контекст) val layoutParams = ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT) ограничениеLayout.layoutParams = LayoutParams val ограничениеSet = ConstraintSet() ограничениеSet.clone(constraintLayout) textView.id = View.generateViewId(); composeView.id = View.generateViewId(); ограничениеLayout.addView(textView) ограничениеLayout.addView(composeView) textView.text = "Привет из xml" textView.textSize = 30f textView.setTextColor(Color.BLUE) ограниченияSet.constrainWidth(textView.id,ConstraintSet.MATCH_CONSTRAINT); ограниченияSet.constrainHeight(textView.id,ConstraintSet.WRAP_CONTENT); ограничениеSet.connect(textView.id,ConstraintSet.LEFT,ConstraintSet.PARENT_ID,ConstraintSet.LEFT); ограничениеSet.connect(textView.id,ConstraintSet.RIGHT,ConstraintSet.PARENT_ID,ConstraintSet.RIGHT); ограничениеSet.connect(textView.id,ConstraintSet.TOP,ConstraintSet.PARENT_ID,ConstraintSet.TOP); ограничениеSet.connect(textView.id,ConstraintSet.BOTTOM,ConstraintSet.PARENT_ID,ConstraintSet.BOTTOM); ограничениеSet.applyTo(constraintLayout) composeView.setContent { МойКомпонироватьТекст() } } переопределить удовольствие располагать() {} } @Композитный весело MyComposeText() { Text(text = "Привет из сообщения") } уже добавлено в build.gradle
buildFeatures { сочинять правду } composeOptions { kotlinCompilerExtensionVersion '1.4.0' } Изначально я столкнулся с ошибкой java.lang.IllegalStateException: ViewTreeLifecycleOwner не найден. Я нашел решение в этом вопросе: ссылка stackoverflow.com. Однако, когда я снова запустил приложение, я все равно получил ту же ошибку. Подумав, что это могла быть моя ошибка, я скопировал код из ссылки на упомянутый вопрос, но ошибка не исчезла.
Мой пример использования: В моем приложении есть вариант использования для отображения наложения при поступлении нового заказа в ресторан. Это предупреждение должно отображаться перед любым другим приложением, даже если основное приложение закрыто. Я уже разработал эту функциональность, используя пакет pub от pub.dev. Изучив код пакета, я внес изменения, чтобы адаптировать его к своим конкретным требованиям. Исходный код пакета уже написан на Android XML, но я планирую создать еще один плагин для внутреннего использования. Я намерен разработать это с помощью Android Jetpack без использования XML, что позволит вносить изменения в дизайн Flutter посредством передачи аргументов через каналы методов.
Я столкнулся с проблемой при интеграции Android Jetpack Compose во Flutter с использованием представления платформы, предоставляемого Flutter.
java.lang.NoSuchMethodError: нет виртуального метода setContent(Lkotlin/jvm/functions/Function0;)V в классе Landroidx/compose/ui/platform/ComposeView; или его суперклассы (объявление androidx.compose.ui.platform.ComposeView появляется в /data/app/~~jNPuLsqJ5chFROaeevr0TQ==/com.example.example-_A0JqLOSwN-L0KrftRNktw==/base.apk)
импортировать android.content.Context импортировать android.graphics.Color импортировать android.view.View импортировать android.view.ViewGroup импортировать android.widget.TextView импортировать androidx.compose.material3.Text импортировать androidx.compose.runtime.Composable импортировать androidx.compose.ui.platform.ComposeView импортировать androidx.constraintlayout.widget.ConstraintLayout импортировать androidx.constraintlayout.widget.ConstraintSet импортировать io.flutter.embedding.android.FlutterFragmentActivity импортировать io.flutter.embedding.engine.FlutterEngine импортировать io.flutter.plugin.common.StandardMessageCodec импортировать io.flutter.plugin.platform.PlatformView импортировать io.flutter.plugin.platform.PlatformViewFactory класс MainActivity: FlutterFragmentActivity() { переопределить удовольствие configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) флаттерДвигатель .platformViewsController .регистрация .registerViewFactory("flutter_native_example", MyComposeViewFactory()) } } класс MyComposeViewFactory: PlatformViewFactory(StandardMessageCodec.INSTANCE) { переопределить fun create(context: Context, viewId: Int, args: Any?): ПлатформаВью { val CreationParams = args as Map? вернуть MyComposeView (контекст, viewId, CreationParams) } } класс MyComposeView(контекст: Context, id: Int, CreationParams: Map?) : PlatformView { частное ограничениеLayout: ConstraintLayout частный val textView: TextView частный val composeView: ComposeView переопределить удовольствие getView(): View { ограничение возвратаLayout } в этом { ограничениеLayout = ConstraintLayout(контекст) textView = TextView(контекст) composeView = ComposeView(контекст) val layoutParams = ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT) ограничениеLayout.layoutParams = LayoutParams val ограничениеSet = ConstraintSet() ограничениеSet.clone(constraintLayout) textView.id = View.generateViewId(); composeView.id = View.generateViewId(); ограничениеLayout.addView(textView) ограничениеLayout.addView(composeView) textView.text = "Привет из xml" textView.textSize = 30f textView.setTextColor(Color.BLUE) ограниченияSet.constrainWidth(textView.id,ConstraintSet.MATCH_CONSTRAINT); ограниченияSet.constrainHeight(textView.id,ConstraintSet.WRAP_CONTENT); ограничениеSet.connect(textView.id,ConstraintSet.LEFT,ConstraintSet.PARENT_ID,ConstraintSet.LEFT); ограничениеSet.connect(textView.id,ConstraintSet.RIGHT,ConstraintSet.PARENT_ID,ConstraintSet.RIGHT); ограничениеSet.connect(textView.id,ConstraintSet.TOP,ConstraintSet.PARENT_ID,ConstraintSet.TOP); ограничениеSet.connect(textView.id,ConstraintSet.BOTTOM,ConstraintSet.PARENT_ID,ConstraintSet.BOTTOM); ограничениеSet.applyTo(constraintLayout) composeView.setContent { МойКомпонироватьТекст() } } переопределить удовольствие располагать() {} } @Композитный весело MyComposeText() { Text(text = "Привет из сообщения") } уже добавлено в build.gradle
buildFeatures { сочинять правду } composeOptions { kotlinCompilerExtensionVersion '1.4.0' } Изначально я столкнулся с ошибкой java.lang.IllegalStateException: ViewTreeLifecycleOwner не найден. Я нашел решение в этом вопросе: ссылка stackoverflow.com. Однако, когда я снова запустил приложение, я все равно получил ту же ошибку. Подумав, что это могла быть моя ошибка, я скопировал код из ссылки на упомянутый вопрос, но ошибка не исчезла.
Мой пример использования: В моем приложении есть вариант использования для отображения наложения при поступлении нового заказа в ресторан. Это предупреждение должно отображаться перед любым другим приложением, даже если основное приложение закрыто. Я уже разработал эту функциональность, используя пакет pub от pub.dev. Изучив код пакета, я внес изменения, чтобы адаптировать его к своим конкретным требованиям. Исходный код пакета уже написан на Android XML, но я планирую создать еще один плагин для внутреннего использования. Я намерен разработать это с помощью Android Jetpack без использования XML, что позволит вносить изменения в дизайн Flutter посредством передачи аргументов через каналы методов.
Мобильная версия