Flutter和原生交互---StreamController.broadcast
Posted 泸沽烟火
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flutter和原生交互---StreamController.broadcast相关的知识,希望对你有一定的参考价值。
上一篇文章说道通过EventChannel使得Flutter监听android原生的信息流变化,这种EventChannel需要我们在MainActivity中手动注册插件
通过StreamController.broadcast可以不用在MainActivity中手动注册插件(如果是在编写一个插件的话),而是通过真正的插件形式使得Flutter具有监听Android原生的能力
1.Flutter插件代码:注册并声明StreamController对象,并实现MethodChannel的setMethodCallHandler方法,
import 'dart:async';
import 'package:flutter/services.dart';
class GetTimePlugin {
static const MethodChannel _channel = const MethodChannel('get_android_time');
StreamController<String> _responseGetTime = new StreamController.broadcast();
Stream<String> get responseGetTime => _responseGetTime.stream;
SsoLoginPlugin() {
_channel.setMethodCallHandler(_handler);
}
Future<dynamic> _handler(MethodCall methodCall) {
if (methodCall.method == "onGetTimeCallback") {
if ("success" == methodCall.arguments["result"]) {
String time = methodCall.arguments["time"];
_responseGetTime.add(time);
} else {
_responseGetTime.add(null);
}
}
return null;
}
///
/// 获取time
///
Future<String> get getTime async {
final String version = await _channel.invokeMethod('getTime');
return version;
}
dispose() {
_responseGetTime.close();
}
}
2.在Flutter中注册并调用回调方法:
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String _time = 'Unknown';
GetTimePlugin getTimePlugin = GetTimePlugin();
@override
void initState() {
super.initState();
getTimePlugin.responseGetCode.listen((event) {
print("event: $event");
setState(() {
_time = event;
});
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Plugin example app'),
),
body: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('time is: $_time'),
SizedBox(
height: 100,
),
FlatButton(
onPressed: () {
getTimePlugin.getTime();
},
child: Text("获取时间"))
],
),
),
);
}
}
3.原生逻辑中,通过注册的MethodChannel对象,调用上面注册的方法名称,实现Android通知Flutter:
Calendar calendar = Calendar.getInstance();
Map<String, String> result = new HashMap<>();
result.put("result", "success");
result.put("time", calendar.getTime().toString());
channel.invokeMethod("onGetTimeCallback", result);
以上是关于Flutter和原生交互---StreamController.broadcast的主要内容,如果未能解决你的问题,请参考以下文章