Flutter學(xué)習(xí)訣竅朱巨,F(xiàn)lutter一切皆組件澄耍!
Android與Flutter之間的通信共有四種實(shí)現(xiàn)方式奢米。
- 由于在初始化flutter頁(yè)面時(shí)會(huì)傳遞一個(gè)字符串——route油湖,因此我們就可以拿route來(lái)做文章检激,傳遞自己想要傳遞的數(shù)據(jù)肴捉。該種方式僅支持單向數(shù)據(jù)傳遞且數(shù)據(jù)類(lèi)型只能為字符串,無(wú)返回值叔收。
- 通過(guò)EventChannel來(lái)實(shí)現(xiàn)齿穗,EventChannel僅支持?jǐn)?shù)據(jù)單向傳遞,無(wú)返回值饺律。
- 通過(guò)MethodChannel來(lái)實(shí)現(xiàn)窃页,MethodChannel支持?jǐn)?shù)據(jù)雙向傳遞,有返回值复濒。
- 通過(guò)BasicMessageChannel來(lái)實(shí)現(xiàn)脖卖,BasicMessageChannel支持?jǐn)?shù)據(jù)雙向傳遞,有返回值巧颈。
一畦木、先看下初始化的方式
FlutterView flutterView = Flutter.createView(this, getLifecycle(), "route");
route就是默認(rèn)的路由字段,這個(gè)字段可以是一個(gè)JSON對(duì)象砸泛,這樣就可以實(shí)現(xiàn)原生傳遞給Flutter數(shù)據(jù)十籍,F(xiàn)lutter在自己的路由中心解析這個(gè)JSON對(duì)象蛆封,獲取到需要的數(shù)據(jù)進(jìn)行處理,初始化頁(yè)面就ok了勾栗。
二惨篱、EventChannel
原生傳遞給Flutter數(shù)據(jù),這個(gè)方式可以避免一中的在路由里面處理數(shù)據(jù)围俘,Android代碼如下:
new EventChannel(flutterView, CHANNEL_POST).setStreamHandler(new EventChannel.StreamHandler() {
@Override
public void onListen(Object o, EventChannel.EventSink eventSink) {
eventSink.success("原生傳遞參數(shù)");
}
@Override
public void onCancel(Object o) {
}
});
其中的CHANNEL_POST妒蛇,是自己定義的一個(gè)協(xié)議,和Flutter側(cè)統(tǒng)一就可以楷拳,在main.dart中注冊(cè)該方法就可以绣夺,示例代碼如下:
Application.eventChannel = const EventChannel(TTKeys.channel_native_post);
參數(shù)的獲取在路由到的頁(yè)面中實(shí)現(xiàn),如下所示:
String naviTitle = '商品詳情';
// 回調(diào)事件
void _onEvent(Object event) {
setState(() {
naviTitle = event.toString();
});
}
// 錯(cuò)誤返回
void _onError(Object error) {
}
三欢揖、MethodChannel
該方式可以實(shí)現(xiàn)雙向通道陶耍,F(xiàn)lutter調(diào)用原生,原生再返回?cái)?shù)據(jù)給Flutter她混,注冊(cè)的方式和EventChannel類(lèi)似烈钞,Android端的代碼如下:
MethodChannel channelGet = new MethodChannel(flutterView, CHANNEL_GET);
channelGet.setMethodCallHandler((call, result) -> {
result.success(authHeader());
switch (call.method) {
case "router":
String args = (String) call.arguments;
result.success("回傳給Flutter的參數(shù)");
break;
default:
break;
}
});
Flutter端使用一下的方法獲取Android回傳的數(shù)據(jù):
Application.methodChannel.invokeMethod("router")
這里的路由字段可以自由定義,能區(qū)分開(kāi)就好坤按。
四毯欣、BasicMessageChannel
BasicMessageChannel是一種能夠在native與flutter之間互相發(fā)送消息的通信方式,它支持?jǐn)?shù)據(jù)類(lèi)型最多臭脓,使用范圍最廣酗钞。EventChannel與MethodChannel的應(yīng)用場(chǎng)景可以使用BasicMessageChannel來(lái)實(shí)現(xiàn),但BasicMessageChannel的應(yīng)用場(chǎng)景就不一定能夠使用EventChannel與MethodChannel來(lái)實(shí)現(xiàn)来累。該方式有返回值砚作。
Android端代碼如下:
public class BasicMessageChannelPlugin implements BasicMessageChannel.MessageHandler<String> {
private Activity activity;
private BasicMessageChannel<String> messageChannel;
static BasicMessageChannelPlugin registerWith(FlutterView flutterView) {
return new BasicMessageChannelPlugin(flutterView);
}
private BasicMessageChannelPlugin(FlutterView flutterView) {
this.activity = (Activity) flutterView.getContext();
this.messageChannel = new BasicMessageChannel<String>(flutterView, "BasicMessageChannelPlugin", StringCodec.INSTANCE);
messageChannel.setMessageHandler(this);
}
@Override
public void onMessage(String s, BasicMessageChannel.Reply<String> reply) {
reply.reply("BasicMessageChannelPlugin收到:" + s);
if (activity instanceof FlutterAppActivity) {
((FlutterAppActivity) activity).showContent(s);
}
}
void send(String str, BasicMessageChannel.Reply<String> reply) {
messageChannel.send(str, reply);
}
}
Flutter端的代碼如下:
class _MyHomePageState extends State<MyHomePage> {
//StringCodec()為編碼格式
BasicMessageChannel<String> _basicMessageChannel =
BasicMessageChannel("BasicMessageChannelPlugin", StringCodec());
@override
void initState() {
_basicMessageChannel.setMessageHandler((message) => Future<String>(() {
print(message);
//message為native傳遞的數(shù)據(jù)
setState(() {
_content = message;
});
//給Android端的返回值
return "收到Native消息:" + message;
}));
_controller = TextEditingController();
super.initState();
}
//向native發(fā)送消息
void _sendToNative() {
Future<String> future = _basicMessageChannel.send(_controller.text);
future.then((message) {
_resultContent = "返回值:" + message;
});
}
@override
Widget build(BuildContext context) {...}
}
原生與Flutter數(shù)據(jù)交互,主要就是構(gòu)建好通道機(jī)制嘹锁,可以多嘗試不同的數(shù)據(jù)傳遞葫录,構(gòu)建拓展性比較高的路由中心。感謝閱讀~
如有疑問(wèn)可加好友探討