首页 > 解决方案 > 如何将 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) 调用(本机方法)

我知道我还没有实现第二个按钮功能,但我想知道应用程序的片段插入是否如文档所示那样工作。

提前致谢。

标签: androidflutterkotlinandroid-fragments

解决方案


推荐阅读