原生主动调用flutter

Posted by アライさん on 2019年10月22日
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class MainActivity: FlutterActivity() {
//通道名称为samples.flutter.io/battery,和flutter中的一样
private val NET_CHANGE_CHANNEL = "samples.flutter.io/netChanged"
private lateinit var context: Context

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
GeneratedPluginRegistrant.registerWith(this)
context = this
//通过通道监听对应名字的方法

EventChannel(flutterView,NET_CHANGE_CHANNEL).setStreamHandler(object : EventChannel.StreamHandler{
private var netStateChangeReceiver: BroadcastReceiver? = null

override fun onListen(arguments: Any?, events: EventChannel.EventSink) {
netStateChangeReceiver = createNetStateChangeReceiver(events)
registerReceiver(netStateChangeReceiver, IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION))
}

override fun onCancel(p0: Any?) {
unregisterReceiver(netStateChangeReceiver)
netStateChangeReceiver = null
}
})
}

private fun createNetStateChangeReceiver(events: EventChannel.EventSink): BroadcastReceiver {
return object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val networkConnected = isConnectedToNetwork(context)
events.success(networkConnected)
}
}
}

fun isConnectedToNetwork(context: Context): Boolean {
val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val netInfo = cm.activeNetworkInfo
return netInfo != null && netInfo.isConnected
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class _MyHomePageState extends State<MyHomePage> {
//通道名称为samples.flutter.io/battery,和android原生中接收的一样

static const netPlatform =
const EventChannel('samples.flutter.io/netChanged');

var netState = true;

@override
void initState() {
super.initState();
netPlatform.receiveBroadcastStream().listen(_onEvent, onError: _onError);
}

void _onEvent(Object event) {
setState(() {
netState = event;
});
}

void _onError(Object error) {
setState(() {
netState = false;
});
}

@override
Widget build(BuildContext context) {
return new Material(
child: new Center(
child: new Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
new Text('netState=' + netState.toString()),
],
),
),
);
}
}