【错误记录】Flutter 混合开发获取 BinaryMessenger 报错 ( FlutterActivityAndFragmentDelegate.getFlutterEngine() )
文章目錄
- 一、 報錯信息
- 二、 解決方案
一、 報錯信息
在 Flutter 混合開發中 , 開發 Android 與 Flutter 信息交互功能 ;
創建 BasicMessageChannel 通道 , 其構造函數如下 :
public BasicMessageChannel(@NonNull BinaryMessenger messenger, @NonNull String name, @NonNull MessageCodec<T> codec) {首先要獲取 BinaryMessenger 實例對象 ;
BinaryMessenger 實例對象需要從 FlutterEngine 中獲取 ;
獲取流程如下 :
首先 , 創建 FlutterFragment , 這是要嵌入到 Android 的 Activity 界面中的 Flutter 界面 ;
mFlutterFragment = FlutterFragment.withNewEngine().initialRoute("嵌入 FlutterFragment").build();然后 , 顯示該 Flutter 頁面 , 這里直接將 Flutter 頁面的 Fragment 設置到 Activity 中即可 ;
fragmentTransaction.replace(R.id.frame, mFlutterFragment); fragmentTransaction.commit();最后 , 獲取 FlutterEngine , 但是在此處報錯 ;
mFlutterFragment.getFlutterEngine() ;報錯信息如下 :
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)二、 解決方案
報錯位置在 FlutterFragment 中 , 在調用 getFlutterEngine 方法時報錯 , getFlutterEngine 方法相關代碼如下 :
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();} }報錯信息是
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 才會進行初始化 ;
在 Android 中嵌入 Flutter 頁面 , 比較慢 , 大概耗時 1 ~ 3 秒左右 ;
也就是說在 Flutter 頁面顯示成功之前 , FlutterActivityAndFragmentDelegate delegate 值都是 null , 此時通過 Fragment 獲取 FlutterEngine() , 都會報空指針異常 ;
在啟動 Flutter 頁面后 , 延遲 5 秒 , 再進行初始化 , 即可解決上述問題 ;
mFlutterFragment = FlutterFragment.withNewEngine().initialRoute("嵌入 FlutterFragment").build();Log.i(TAG, "mFlutterFragment : " + mFlutterFragment);// 創建 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 傳遞消息成功 :
總結
以上是生活随笔為你收集整理的【错误记录】Flutter 混合开发获取 BinaryMessenger 报错 ( FlutterActivityAndFragmentDelegate.getFlutterEngine() )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【错误记录】Flutter 混合开发报错
- 下一篇: 【Flutter】Flutter 混合开