Android原生和flutter混合开发

2019-09-25  本文已影响0人  A代码搬运工

Flutter module引入

$ cd some/path/
$ flutter create -t module --org com.example my_flutter

注明:

Android原生的gradle版本和sdk版本需和flutter_module下的.android保持一致

原生调Flutter

flutter代码:

void main() => runApp(_widgetForRoute(window.defaultRouteName));

Widget _widgetForRoute(String route) {
  return MyApp();
}

class MyApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return MyAppState();
  }

}

Android原生添加Flutter:

            FlutterView flutterView = Flutter.createView(TestActivity.this, getLifecycle(),"route1");
            FrameLayout.LayoutParams layout = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
            addContentView(flutterView, layout);
            FragmentTransaction tx = getSupportFragmentManager().beginTransaction();
            tx.replace(R.id.rootview, Flutter.createFragment("route1"));
            tx.commit();

注明:

FlutterView继承自SurfaceView,如果Debug模式加载flutterview页面有闪动正常,release模式好很多。

Flutter和原生的通信

Flutter和原生支持三种通信:

Channel所支持的数据类型:

Dart Android iOS
null null nil (NSNull when nested)
bool java.lang.Boolean NSNumber numberWithBool:
int java.lang.Integer NSNumber numberWithInt:
int, if 32 bits not enough java.lang.Long NSNumber numberWithLong:
double java.lang.Double NSNumber numberWithDouble:
String java.lang.String NSString
Uint8List byte[] FlutterStandardTypedData typedDataWithBytes:
Int32List int[] FlutterStandardTypedData typedDataWithInt32:
Int64List long[] FlutterStandardTypedData typedDataWithInt64:
Float64List double[] FlutterStandardTypedData typedDataWithFloat64:
List java.util.ArrayList NSArray
Map java.util.HashMap NSDictionary

以BasicMessageChannel为例:

android原生代码:

   basicMessageChannel = new BasicMessageChannel<String>(flutterView, "com.simple.channelflutterandroid/basic",
                StringCodec.INSTANCE);

        findViewById(R.id.button2).setOnClickListener(v -> {
//            basicMessageChannel.send("我是Native发送的消息");
            basicMessageChannel.send("我是Native发送的消息", new BasicMessageChannel.Reply() {
                @Override
                public void reply(Object o) {
                    Log.i("json","o: " + o);
                }
            });

        });

       basicMessageChannel.setMessageHandler((o, reply) -> Log.i("json","o= " + o));

Flutter端代码:

BasicMessageChannel _basicMessageChannel = BasicMessageChannel("com.simple.channelflutterandroid/basic", StringCodec());

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    receiveMessage();
  }

  void receiveMessage() {
    _basicMessageChannel.setMessageHandler((str) async{
      print("It is Flutter -  receive str");

      setState(() {
        _text = str;
      });

    });
  }


  //发送消息给android
  Future<String> _sendMessage() async{
    String reply = await _basicMessageChannel.send("我是Flutter发送的消息");
    return reply;
  }

Flutter module发布到maven

flutter build apk

如果不涉及到第三方插件,直接集成生成的aar就ok。

如果涉及到第三方插件:

参考文章

https://github.com/flutter/flutter/wiki/Add-Flutter-to-existing-apps

Flutter与Android混合开发及Platform Channel的使用

flutter打包aar上传maven集成到原生android工程

其他

《Flutter实战》

Flutter官方API

pub.dev

上一篇 下一篇

猜你喜欢

热点阅读