添加到应用程序中不存在请求的 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
打开开发者设置,将“后台进程”设置为“否”
后台进程”并设置不保留活动。
打开应用程序按主页
再次打开应用程序..它会崩溃并出现异常。
原因: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
。
我已经使用缓存的 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
打开开发者设置,将“后台进程”设置为“否” 后台进程”并设置不保留活动。
打开应用程序按主页
再次打开应用程序..它会崩溃并出现异常。
原因:java.lang.IllegalStateException:请求的缓存FlutterEngine在FlutterEngineCache中不存在:'FLUTTER_ENGINE'
Solution
在super.oncreate()
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
。