0%

Flutter 中的广播 Stream

Flutter 中的广播Stream 与 TabBar 导航切换

Android 原生开发中,有 Broadcast 可以用来广播一个 Intent
SDK 也有 EventBus 可以使用

Flutter 中想要广播一个数据,原生可以使用的是 Stream

它与 Future 一样,位于 async ,用来异步使用

例如目前我使用了 TabBar 创建了三个 tab

需要在其他页面异步获取数据后,根据状态,滑动 TabBar 到指定页面

创建

首先创建一个 dart 格式文件,定义文件内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import 'dart:async';

class StateSubject {
static final StateSubject _instance = StateSubject._();

factory StateSubject() => StateSubject._instance;

StreamController<int> streamController;

StateSubject._() {
streamController = StreamController.broadcast();
}

void update(int num) {
streamController.sink.add(num);
}
}

在 app 加载时订阅这个 Stream

例如在 initState 中订阅

使用 StateSubject().streamController.stream.listen ,传入一个方法参数进行监听

1
2
3
4
5
6
7
8
9
10
11
12
13
@override
void initState() {
super.initState();
controller = TabController(length: 3, vsync: this);
StateSubject().streamController.stream.listen((data) {
log("listen a data:" + data.toString());
if (data > controller.length || data < 0) {
return;
}
// 设置 TabBar 下标位置
controller.index = data;
});
}

使用

在任意地方调用即可

1
2
3
4
5
6
7
//  点击按钮
clickAddBtn() {
log("click add btn");

//将首页的tabBar 定位到 index = 1
StateSubject().update(1);
}

效果

首页:

首页

点击按钮后跳到第二页,如果未登陆,跳到第三页要求登录

跳转

附上TabBarView的使用

定义TabController

首先创建 StatefulWidget

1
2
3
4
5
6
7
8
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);

final String title;

@override
_MyHomePageState createState() => _MyHomePageState();
}

创建 State

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
42
43
44
45
46
47
48
49
50
class _MyHomePageState extends State<MyHomePage>{
TabController controller;


@override
void initState() {
// TODO: implement initState
super.initState();
controller = TabController(length: 3, vsync: this);
}


@override
void dispose() {
super.dispose();
controller.dispose();
}


@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Scaffold(
body: new TabBarView(controller: controller, children: <Widget>[
new HomePage(),
new CreatePage(),
new MyPage()
]),
bottomNavigationBar: new Material(
color: Colors.blue,
child: new TabBar(controller: controller, tabs: [
new Tab(
text: "首页",
),
new Tab(
text: "发布",
),
new Tab(
text: "我的",
)
]),
),
),
);
}

}

HomePage CreatePage MyPage 需要另外创建