一个小demo搞懂Flutter调用Android.
背景:一些操作如:文件存储、数据库操作等单纯的Flutter是不能实现的.
Flutter使用了一个灵活的系统,允许您调用特定平台的API,无论在Android上的Java或Kotlin代码中,还是iOS上的ObjectiveC或Swift代码中均可用。应用的Flutter部分通过平台通道(platform channel)将消息发送到其应用程序的所在的宿主(iOS或Android).
平台通道在客户端(Flutter UI)和宿主(平台)之间传递消息,如下图所示:
Android平台我们需要借助于MethodChannel来与Android平台代码交互 代码如下:
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() {
runApp(MaterialApp(
home: MyApp(),
));
}
class MyApp extends StatelessWidget {
// 在dart代码中调用所需要的通道.可以自己定义但必须要和MainActivity中的使用保持一致.
static const platform = const MethodChannel("com.flyou.test/android");
showToast(String msg) async {
try {
//调用Android平台的方法.
await platform.invokeMethod("showToast",{"msg":msg});
} on PlatformException catch (e) {
print(e.toString());
}
}
@override
Widget build(BuildContext context) {
return Scaffold(appBar: AppBar(title: Text("platformChannels"),),body: Center(
child: RaisedButton(
child: Text("点我提示"),
onPressed: () {
showToast("我是android系统的toast");
},
),
),);
}
}
这里使用platform.invokeMethod(“showToast”,{“msg”:msg})
来调用我们在Android平台定义的“showToast”方法
然后响应的在Android平台MainActivity中操作.
package com.example.flutter_android2;
import android.os.Bundle;
import android.text.TextUtils;
import android.widget.Toast;
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugins.GeneratedPluginRegistrant;
public class MainActivity extends FlutterActivity {
//与dart文件中定义通道保持一致
private static final String CHANNEL = "com.flyou.test/android";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GeneratedPluginRegistrant.registerWith(this.getFlutterEngine());
new MethodChannel(getFlutterEngine().getDartExecutor().getBinaryMessenger(), CHANNEL).setMethodCallHandler(
(call, result) -> {
System.out.println(call.method);
if (call.method.equals("showToast")) {
if (call.hasArgument("msg") && !TextUtils.isEmpty(call.argument("msg").toString())) {
Toast.makeText(MainActivity.this, call.argument("msg").toString(), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "toast text must not null", Toast.LENGTH_SHORT).show();
}
}
});
}
}
效果如果:
至此完成一个简单的Flutter调用Android原生代码的操作!