Android原生项目接入Flutter module

Android原生项目接入Flutter module

1.在settings.gradle中接入Flutter module

setBinding(new Binding([gradle: this]))
evaluate(new File(
        settingsDir.parentFile,
        '../Flutter/flutter_module/.android/include_flutter.groovy'
))
复制代码

2.在app的build.gradle中`

//集成Flutter项目
implementation project(':flutter')
复制代码

3.创建flutter引擎`

/**
 * @Description: 启动引擎、发送消息和接受消息工具类
 * @Version: 1.0
 * @Author: samson
 * @Date: 2021/7/23 10:52
 */
public class FlutterTools {

    public static final String ENGINE_ID = "default_engine_id";

    private static final String              METHOD_CHANNEL = "com.basic.message.channel";
    //flutter引擎
    private static       FlutterEngine       sFlutterEngine;
    //消息通道
    private static       BasicMessageChannel basicMessageChannel;

    /**
     * 加载flutter引擎
     *
     * @param context
     */
    public static void preWarmFlutterEngine(Context context) {
        if (null == sFlutterEngine) {
            sFlutterEngine = new FlutterEngine(context);
            sFlutterEngine.getDartExecutor().executeDartEntrypoint(
                    DartExecutor.DartEntrypoint.createDefault()
            );
            basicMessageChannel = new BasicMessageChannel(sFlutterEngine.getDartExecutor(), METHOD_CHANNEL, StandardMessageCodec.INSTANCE);
            FlutterEngineCache.getInstance().put(ENGINE_ID, sFlutterEngine);
            //接受flutter消息监听
            basicMessageChannel.setMessageHandler((message, reply) -> {
                //接受flutter消息,跳转到原生页面,可以根据message不同
                 String messageStr = (String) message;
                if (message != null) {
                    NativeFlutterEntity flutterEntity = JsonUtil.getBeanFromJsonStr(messageStr, NativeFlutterEntity.class);
                    dealFlutterMessage(context,flutterEntity,reply);
                }
            });
        }
    }

    /**
     * 处理flutter发送过来的消息
     * @param context
     * @param flutterEntity
     */
    private static void dealFlutterMessage(Context context, NativeFlutterEntity flutterEntity, BasicMessageChannel.Reply reply){
        if("settingId".equals(flutterEntity.pageId)) {
            //去设置
            Intent intent = new Intent(context, SetActivity.class);
            context.startActivity(intent);
        }
    }

    /**
     * 发送数据到flutter
     *
     * @param json
     */
    public static void setDataToFlutter(String json) {
        basicMessageChannel.send(json);
    }


    public static void clearEngine(){
        if (sFlutterEngine != null) {
            sFlutterEngine = null;
        }
    }

    /**
     * 销毁引擎
     */
    public static void destroyEngine() {
        if (sFlutterEngine != null) {
            sFlutterEngine.destroy();
            sFlutterEngine = null;
        }
    }
}
复制代码

4.创建FlutterActivity

/**
 * 原生启动flutter页面
 * 存在的问题:
 * flutter初始化页面 返回会状态不会被重新刷新
 */
public class AndroidFlutterActivity extends FlutterActivity {

    static final  String   EXTRA_CACHED_ENGINE_ID = "cached_engine_id";
    static final  String   EXTRA_ROUTE = "extra_route";
    static final  String   EXTRA_DESTROY_ENGINE_WITH_ACTIVITY = "destroy_engine_with_activity";
    public static Activity mActivity;
    private BroadcastReceiver broadcastReceiver;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mActivity = this;
    }

    /**
     * 打开flutter跳转页面
     * @param context
     * @param route
     */
    public static void open(Context context, String route) {
        Intent intent = new Intent(context, AndroidFlutterActivity.class)
                .putExtra(EXTRA_CACHED_ENGINE_ID, "default_engine_id")
                .putExtra(EXTRA_ROUTE, route)
                // Activity 销毁时保留 FlutterEngine
                .putExtra(EXTRA_DESTROY_ENGINE_WITH_ACTIVITY, false);
        context.startActivity(intent);
    }

    /**
     * 加载flutterView
     */
    @Override
    public void onFlutterUiDisplayed() {
        super.onFlutterUiDisplayed();
        // 设置 Flutter 界面入口,注意不要在 onCreate 方法中调用,否则
        // Flutter 入口不会更新。
        String route = getIntent().getStringExtra(EXTRA_ROUTE);
        //发送路由消息到flutter页面
        FlutterTools.setDataToFlutter(route);
    }

    @Override
    public void onFlutterUiNoLongerDisplayed() {
        super.onFlutterUiNoLongerDisplayed();
    }
}
复制代码
<!-- Android跳转flutter -->
<activity
    android:name="io.flutter.embedding.android.FlutterActivity"
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
    android:hardwareAccelerated="true"
    android:theme="@style/FlutterPageTheme"
    android:windowSoftInputMode="adjustResize"/>
<activity
    android:name=".flutter.AndroidFlutterActivity"
    android:configChanges="keyboardHidden|orientation|screenSize"
    android:screenOrientation="portrait"
    android:theme="@style/FlutterPageTheme"
    tools:ignore="LockedOrientationActivity" />
复制代码

5.在flutter module中

//信息通道
  static late BasicMessageChannel messageChannel;

  ///初始化
  static init() {
    messageChannel = const BasicMessageChannel(
        "com.basic.message.channel", StandardMessageCodec());
  }

 /// 发送数据到原生
  static Future<dynamic> sendData(
      {required String  data}) async {
 //最好使用json格式传递数据
    return await sendMessage(data);
  }

  @override
  void initState() {
    super.initState();
    // 设置 MethodCallHandler 接收来自 Android 的消息
    FlutterToNative.receiveData((message) async {
      _handleInitRouteMethodCall(message);
    });
  }

//根据传入的url打开不同的页面
 void _handleInitRouteMethodCall(String routeUrl) async {
    switch (routeUrl) {
      case '/authorityPage':
        _initRoute = AuthorityPage();
        break;
      case '/HomePage':
        _initRoute = HomePage();
        break;
      default:
        _initRoute = WelcomePage();
        break;
    }

    /// 更新界面
    setState(() {});
  }
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享