Flutter 混合开发

319 阅读2分钟

混合开发模式

image.png

工程模式

image.png

image.png

创建项目

image.png

image.png

image.png

image.png

消息通道

image.png

  • demo中插入一个 initState

Code -> Generate -> Override Methods

image.png

image.png

image.png

image.png

消息道通例子

initState() 添加一个 super.initState()

私有 添加下划线 _

打开安卓项目

image.png

因为这是flutter 项目 所以不知道你要写安卓 所以 我们可以单独打开这个flutter 下面的android项目。

image.png

androidStudio自动修复好

image.png

单引号 双引号

谷歌推荐用单引号 里面有单引号 外面双引号

格式化

Command + option + l

编写完项目执行

flutter clean
flutter pub get 没依赖可以不执行
flutter run

用安卓模拟器运行

Error: ADB exited with exit code 1
Performing Streamed Install
adb: failed to install /Users/wangpanpan/Desktop/myflutter/douyin/first/build/app/outputs/flutter-apk/app.apk: Failure [INSTALL_FAILED_INSUFFICIENT_STORAGE]
Error launching application on sdk gphone64 arm64.

直接运行Android 也报错

02/20 14:19:01: Launching 'app' on Pixel 2 (Edited) API 33.
Installation did not succeed.
The application could not be installed: INSTALL_FAILED_INSUFFICIENT_STORAGE

List of apks:
[0] '/Users/wangpanpan/Desktop/myflutter/douyin/first/build/app/outputs/apk/debug/app-debug.apk'
The device needs more free storage to install the application (extra space is needed in addition to APK size).
Retry
Failed to launch an application on all devices

image.png

image.png

BasicMessageChannel

用于传递字符串和半结构化的信息

flutter 接受 发送 都是对原生交互 不是flutter自身处理哦

dart代码

String? _message;
static const _channel = BasicMessageChannel("messageChannel", StringCodec());

接受信息 ACK是确认的意思

@override
void initState() {
  super.initState();
  //_channel.setMessageHandler((message) => null)
  // 注册 接受回调 并且返回信息
  _channel.setMessageHandler((message) async {
    setState(() {
      _message = message;
    });
    return 'ACK from dart';
  });
}

发送信息

Future<void> _sendMessage() async {
   String? message = await _channel.send("Hello Android");
   print("Send message: $message");
}

安卓原生

class MainActivity : FlutterActivity() {
    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        // 1.初始化BasicMessageChannel,并传入名称,名称需要和Dart完全一致
        val channel = BasicMessageChannel(
                flutterEngine.dartExecutor,
                "messageChannel",
                StringCodec.INSTANCE
        )
        // 2.通过BasicChannel实例注册接受回调,并且返回ACK
        channel.setMessageHandler { message, reply ->
            Log.d("message", "Android receive message: $message")
            reply.reply("ACK from Android")
        }

        Handler(Looper.getMainLooper()).postDelayed({
            // 3.通过BasicChannel发送消息给Dart
            channel.send("Hello from Android")
        }, 1000)
    }
}

安卓代码调试 run

  • 首先就是启动的时候 安卓原生给flutter 发送 Hello from Android
  • 点击按钮 然后安卓这边收到消息 image.png

安卓收到 flutter 发送的 hello android

flutter 调试 run

image.png

点击按钮 给原生发送消息

image.png

EventChannel

用于数据流(event streams)的通信

static const _channel1 = EventChannel("messageChannel1");
_channel1.receiveBroadcastStream().listen((event) {
  print("Receive event: $event");
  setState(() {
    _message = event;
  });
}, onError: (error) {
  print("Receive error: $error");
}, cancelOnError: true);
val channel1 = EventChannel(flutterEngine.dartExecutor.binaryMessenger, "messageChannel1")

MethodChannel

用于传递方法调用(method invocation)

image.png