添加到应用程序中不存在请求的 flutter 引擎

Requested flutter engine does not exist in Add to app

我已经使用缓存的 flutter 引擎 flutter 进入现有的本机应用程序(添加到应用程序)。

override fun onCreate(savedInstanceState: Bundle?) {
        Log.d(TAG, "onCreate")
        
        
        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_main)
        context = this.application.applicationContext
        if (!FlutterEngineCache.getInstance().contains(
                FLUTTER_ENGINE
            )
        ) {
            mFlutterEngine = FlutterEngine(context)
            mFlutterEngine.dartExecutor
                .executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault())
            FlutterEngineCache.getInstance()
                .put(FLUTTER_ENGINE, mFlutterEngine)
        }
        //Create Flutter Fragment
        mFragmentManager = supportFragmentManager
        mFlutterFragment = mFragmentManager.findFragmentByTag(FLUTTER_FRAGMENT) as FlutterFragment?
        if (mFlutterFragment == null) {
            mFlutterFragment =
                FlutterFragment.withCachedEngine(FLUTTER_ENGINE).transparencyMode(FlutterView.TransparencyMode.opaque).build()
            mFragmentManager
                .beginTransaction()
                .add(R.id.fragment_container, mFlutterFragment as Fragment, FLUTTER_FRAGMENT)
                .commit()
        } else {
            mFragmentManager
                .beginTransaction()
                .show(mFragmentManager.findFragmentByTag(FLUTTER_FRAGMENT)!!)
                .commit()
        }
}

我在生产应用程序中遇到以下崩溃

  Caused by: java.lang.IllegalStateException: The requested cached FlutterEngine did not exist in the FlutterEngineCache: 'FLUTTER_ENGINE'
        at io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.setupFlutterEngine(FlutterActivityAndFragmentDelegate.java:211)
        at io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.onAttach(FlutterActivityAndFragmentDelegate.java:157)
        at io.flutter.embedding.android.FlutterFragment.onAttach(FlutterFragment.java:597)
        at androidx.fragment.app.Fragment.performAttach(Fragment.java:2574)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:828)
        at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
        at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange(FragmentManagerImpl.java:2659)
        at androidx.fragment.app.FragmentManagerImpl.dispatchCreate(FragmentManagerImpl.java:2607)
        at androidx.fragment.app.FragmentController.dispatchCreate(FragmentController.java:235)
        at androidx.fragment.app.FragmentActivity.onCreate(FragmentActivity.java:316)
        at androidx.appcompat.app.AppCompatActivity.onCreate(AppCompatActivity.java:106)
        at com.flutter.android.MainActivity.onCreate(MainActivity.kt:33)
 

How to reproduce

  1. 打开开发者设置,将“后台进程”设置为“否” 后台进程”并设置不保留活动。

  2. 打开应用程序按主页

  3. 再次打开应用程序..它会崩溃并出现异常。

    原因:java.lang.IllegalStateException:请求的缓存FlutterEngine在FlutterEngineCache中不存在:'FLUTTER_ENGINE'

Solution

super.oncreate()

之前初始化flutter引擎
override fun onCreate(savedInstanceState: Bundle?) {
        Log.d(TAG, "onCreate")
         context = this.application.applicationContext
        if (!FlutterEngineCache.getInstance().contains(
                FLUTTER_ENGINE
            )
        ) {
            mFlutterEngine = FlutterEngine(context)
            mFlutterEngine.dartExecutor
                .executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault())
            FlutterEngineCache.getInstance()
                .put(FLUTTER_ENGINE, mFlutterEngine)
        }
       
        
        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_main)
        //Create Flutter Fragment
        mFragmentManager = supportFragmentManager
        mFlutterFragment = mFragmentManager.findFragmentByTag(FLUTTER_FRAGMENT) as FlutterFragment?
        if (mFlutterFragment == null) {
            mFlutterFragment =
                FlutterFragment.withCachedEngine(FLUTTER_ENGINE).transparencyMode(FlutterView.TransparencyMode.opaque).build()
            mFragmentManager
                .beginTransaction()
                .add(R.id.fragment_container, mFlutterFragment as Fragment, FLUTTER_FRAGMENT)
                .commit()
        } else {
            mFragmentManager
                .beginTransaction()
                .show(mFragmentManager.findFragmentByTag(FLUTTER_FRAGMENT)!!)
                .commit()
        }

我认为这里的问题是,当 OS 自动杀死 activity 时,所有缓存引擎都会被杀死,当你重新打开你的应用程序时,你必须控制你的 flutter activity需要。

示例:

  • 您的应用有 2 个 Activity:主页(缓存 engineId0)=> 详细信息(缓存 engineId1),您将引擎名称按升序排列(engineId1、engineId2、engineId3... ).当您在详细信息页面上时,您将您的应用程序置于后台并使用其他应用程序,然后有时 OS 自动终止您的 activity.
  • 当你回到你的应用程序时,它会打开详细信息页面(当然会再次继续创建),但这里的问题是所有引擎都被杀死,然后你检查引擎不存在并重新创建engineId0(堆栈引擎中的第一个),然后是使用此引擎的代码,但似乎 super.onCreate 处的 savedInstanceState 仍然记得并在此详细信息页面 => 请求 engineId1 导致了问题。

解决方案:

  • 你必须找到一种方法来命名你的引擎,而不是按升序。
  • 像这样将 null 传递给 super.onCreate super.onCreate(null) 然后它不会像我上面的例子那样请求 engineId1