android - 如何将 Flutter Fragment 添加到 Kotlin 应用程序
问题描述
我是使用 Kotlin 的 Android 开发人员的新手,我正在使用 Flutter 模块的 Kotlin 应用程序工作,该应用程序有两个按钮,一个调用 Flutter 模块的一个路由并将其显示为单个屏幕,另一个必须显示在同一屏幕中作为片段的不同路线。
我已按照 Flutter 官方网站https://flutter.dev/docs/development/add-to-app/android/project-setup的说明进行操作,到目前为止,我已经成功实现了第一个按钮的功能。
class HelloWorldActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_hello_world);
//FullScreen Button
btn_Full_Screen.setOnClickListener {
startActivity(
FlutterActivity
.withNewEngine()
.initialRoute("home")
.build(this)
)
}
}
}
我在与按钮相同的活动布局中为片段视图创建了一个框架布局。
<fragment
android:id="@+id/fragment_container"
android:layout_width="201dp"
android:layout_height="206dp"
android:layout_marginBottom="304dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
/>
然后,我按照官方文档https://flutter.dev/docs/development/add-to-app/android/add-flutter-fragment?tab=cached-engine-with-initial-route-kotlin-tab,并实现了像这样管理颤振片段的代码。
class HelloWorldActivity : AppCompatActivity() {
companion object {
// Define a tag String to represent the FlutterFragment within this
// Activity's FragmentManager. This value can be whatever you'd like.
private const val TAG_FLUTTER_FRAGMENT = "flutter_fragment"
}
private var flutterFragment: FlutterFragment? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_hello_world);
//Fragment managment code
val fragmentManager: FragmentManager = supportFragmentManager
flutterFragment = fragmentManager
.findFragmentByTag(TAG_FLUTTER_FRAGMENT) as FlutterFragment?
if (flutterFragment == null) {
var newFlutterFragment = FlutterFragment.createDefault()
flutterFragment = newFlutterFragment
fragmentManager
.beginTransaction()
.add(
R.id.fragment_container,
newFlutterFragment,
TAG_FLUTTER_FRAGMENT
)
.commit()
}
//Full Screen Button
btn_Full_Screen.setOnClickListener {
startActivity(
FlutterActivity
.withNewEngine()
.initialRoute("home")
.build(this)
)
}
}
}
当我运行此应用程序崩溃并显示此错误:
E / AndroidRuntime:致命异常:主进程:com.loftydevelopment.helloworldkotlin,PID:7653 java.lang.RuntimeException:无法启动活动ComponentInfo {com.loftydevelopment.helloworldkotlin/com.loftydevelopment.helloworldkotlin.HelloWorldActivity}:android.view。 InflateException:com.loftydevelopment.helloworldkotlin 中的二进制 XML 文件第 46 行:layout/activity_hello_world:com.loftydevelopment.helloworldkotlin:layout/activity_hello_world 中的二进制 XML 文件第 46 行:在 android.app.ActivityThread.performLaunchActivity(ActivityThread .java:3270) 在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 在 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.爪哇:135) 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 在 android.os.Handler.dispatchMessage(Handler.java:107 ) 在 android.os.Looper.loop(Looper.java:214) 在 android.app.ActivityThread.main(ActivityThread.java:7356) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android。 internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 原因:android.view.InflateException: Binary XML file line #46在 com.loftydevelopment.helloworldkotlin:layout/activity_hello_world: com.loftydevelopment.helloworldkotlin:layout/activity_hello_world 中的二进制 XML 文件第 46 行:膨胀类片段时出错 原因:android.view.InflateException:com.loftydevelopment.helloworldkotlin:layout/activity_hello_world 中的二进制 XML 文件第 46 行:错误膨胀类片段 原因:java.lang.VMClassLoader.findLoadedClass 中的 java.lang.NullPointerException(本机方法)在 java.lang.ClassLoader.findLoadedClass( ClassLoader.java:738) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:363) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:312) 在 android.app.Fragment.instantiate(Fragment.java:536 ) 在 android.app.FragmentContainer.instantiate(FragmentContainer.java:53) 在 android.app.FragmentManagerImpl.onCreateView(FragmentManager.java:3553) 在 android.app.FragmentController.onCreateView(FragmentController.java:104) 在 android.app .Activity.onCreateView(Activity.java:6948) 在 androidx.fragment.app.FragmentActivity.onCreateView(FragmentActivity.java:338) 在 android.view.LayoutInflater。tryCreateView(LayoutInflater.java:1069) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:997) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:961) at android.view.LayoutInflater.rInflate(LayoutInflater.java :1123) at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1084) at android.view.LayoutInflater.inflate(LayoutInflater.java:682) at android.view.LayoutInflater.inflate(LayoutInflater.java:534) at android .view.LayoutInflater.inflate(LayoutInflater.java:481) 在 androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:469) 在 androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:140) 在 com。 loftydevelopment.helloworldkotlin.HelloWorldActivity.onCreate(HelloWorldActivity.kt:28) 在 android.app.Activity.performCreate(Activity.java:7802) 在 android.app.Activity.performCreate(Activity.java:7791) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245) 在 android。 app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) 在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 在 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 在 android.app .servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 在 android.os.Handler.dispatchMessage(Handler.java:107) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 在 android.os。 Looper.loop(Looper.java:214) 在 android.app.ActivityThread.main(ActivityThread.java:7356) 在 java.lang.reflect.Method。在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 的 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 调用(本机方法)
我知道我还没有实现第二个按钮功能,但我想知道应用程序的片段插入是否如文档所示那样工作。
提前致谢。
解决方案
推荐阅读
- python - 使用 Altair 直接标记线图
- reactjs - 为什么 withRouter 与 connect() 一起使用会破坏我的反应应用程序?
- elasticsearch - 如何使用 Elasticsearch 数据源获取 Grafana 中字段的每个不同值的最后一个条目
- javascript - 如果我转到下一个滑块,请滚动到某个部分的顶部?
- python - 与 seaborn 的 kdeplot 不显示
- c# - 在.csproj应用设置(Settings.settings)中使用自定义类型时,如何设置默认值?
- c++ - VSCode C++ c_cpp_properties.json“定义”没有定义ubuntu上的符号
- themes - 如何更改 Oracle SQL Developer 中查询结果窗口的背景颜色?
- sql - 动态 SQL 更改数据库名称
- c# - 如何对消费者隐藏 Xamarin Forms 自定义控件中的属性