【错误记录】Flutter 混合开发获取 BinaryMessenger 报错 ( FlutterActivityAndFragmentDelegate.getFlutterEngine() )
文章目錄
- 一、 報(bào)錯(cuò)信息
- 二、 解決方案
一、 報(bào)錯(cuò)信息
在 Flutter 混合開(kāi)發(fā)中 , 開(kāi)發(fā) Android 與 Flutter 信息交互功能 ;
創(chuàng)建 BasicMessageChannel 通道 , 其構(gòu)造函數(shù)如下 :
public BasicMessageChannel(@NonNull BinaryMessenger messenger, @NonNull String name, @NonNull MessageCodec<T> codec) {首先要獲取 BinaryMessenger 實(shí)例對(duì)象 ;
BinaryMessenger 實(shí)例對(duì)象需要從 FlutterEngine 中獲取 ;
獲取流程如下 :
首先 , 創(chuàng)建 FlutterFragment , 這是要嵌入到 Android 的 Activity 界面中的 Flutter 界面 ;
mFlutterFragment = FlutterFragment.withNewEngine().initialRoute("嵌入 FlutterFragment").build();然后 , 顯示該 Flutter 頁(yè)面 , 這里直接將 Flutter 頁(yè)面的 Fragment 設(shè)置到 Activity 中即可 ;
fragmentTransaction.replace(R.id.frame, mFlutterFragment); fragmentTransaction.commit();最后 , 獲取 FlutterEngine , 但是在此處報(bào)錯(cuò) ;
mFlutterFragment.getFlutterEngine() ;報(bào)錯(cuò)信息如下 :
2021-08-30 11:08:39.318 32433-32433/com.example.flutter_native E/AndroidRuntime: FATAL EXCEPTION: mainProcess: com.example.flutter_native, PID: 32433java.lang.NullPointerException: Attempt to invoke virtual method 'io.flutter.embedding.engine.FlutterEngine io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.getFlutterEngine()' on a null object referenceat io.flutter.embedding.android.FlutterFragment.getFlutterEngine(FlutterFragment.java:986)at com.example.flutter_native.MainActivity.initEventChannel(MainActivity.java:104)at com.example.flutter_native.MainActivity.access$100(MainActivity.java:21)at com.example.flutter_native.MainActivity$1.onClick(MainActivity.java:63)at android.view.View.performClick(View.java:6597)at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119)at android.view.View.performClickInternal(View.java:6574)at android.view.View.access$3100(View.java:778)at android.view.View$PerformClick.run(View.java:25885)at android.os.Handler.handleCallback(Handler.java:873)at android.os.Handler.dispatchMessage(Handler.java:99)at android.os.Looper.loop(Looper.java:193)at android.app.ActivityThread.main(ActivityThread.java:6718)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)二、 解決方案
報(bào)錯(cuò)位置在 FlutterFragment 中 , 在調(diào)用 getFlutterEngine 方法時(shí)報(bào)錯(cuò) , getFlutterEngine 方法相關(guān)代碼如下 :
public class FlutterFragment extends Fragmentimplements FlutterActivityAndFragmentDelegate.Host, ComponentCallbacks2 {// Delegate that runs all lifecycle and OS hook logic that is common between// FlutterActivity and FlutterFragment. See the FlutterActivityAndFragmentDelegate// implementation for details about why it exists.@VisibleForTesting /* package */ FlutterActivityAndFragmentDelegate delegate;/*** Hook for subclasses to obtain a reference to the {@link FlutterEngine} that is owned by this* {@code FlutterActivity}.*/@Nullablepublic FlutterEngine getFlutterEngine() {return delegate.getFlutterEngine();} }報(bào)錯(cuò)信息是
java.lang.NullPointerException: Attempt to invoke virtual method 'io.flutter.embedding.engine.FlutterEngine io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.getFlutterEngine()' on a null object referenceFlutterActivityAndFragmentDelegate delegate 為空 ;
在 FlutterFragment 顯示成功后 , 該 delegate 才會(huì)進(jìn)行初始化 ;
在 Android 中嵌入 Flutter 頁(yè)面 , 比較慢 , 大概耗時(shí) 1 ~ 3 秒左右 ;
也就是說(shuō)在 Flutter 頁(yè)面顯示成功之前 , FlutterActivityAndFragmentDelegate delegate 值都是 null , 此時(shí)通過(guò) Fragment 獲取 FlutterEngine() , 都會(huì)報(bào)空指針異常 ;
在啟動(dòng) Flutter 頁(yè)面后 , 延遲 5 秒 , 再進(jìn)行初始化 , 即可解決上述問(wèn)題 ;
mFlutterFragment = FlutterFragment.withNewEngine().initialRoute("嵌入 FlutterFragment").build();Log.i(TAG, "mFlutterFragment : " + mFlutterFragment);// 創(chuàng)建 FlutterFragment fragmentTransaction.replace(R.id.frame, mFlutterFragment); fragmentTransaction.commit();//initEventChannel();new Thread(){@Overridepublic void run() {try {sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}initEventChannel();Log.i(TAG, "mFlutterFragment : " + mFlutterFragment);} }.start();從 Android 中向 Flutter 傳遞消息成功 :
總結(jié)
以上是生活随笔為你收集整理的【错误记录】Flutter 混合开发获取 BinaryMessenger 报错 ( FlutterActivityAndFragmentDelegate.getFlutterEngine() )的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【错误记录】Flutter 混合开发报错
- 下一篇: 【Flutter】Flutter 混合开