为什么connectionState
从 pageB 回来时总是处于等待 ???
A页
@override
void initState() {
super.initState();
Future.delayed(Duration.zero, () {
_bloc.getList(context);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Title'),
),
body: WillPopScope(
child: RefreshIndicator(
key: _refreshIndicatorKey,
onRefresh: _refresh,
child: Container(
child: StreamBuilder<List<ABC>>(
stream: _bloc.abcStream,
builder: (context, snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.waiting:
return Center(
child: Image.asset(
'assets/loading.gif',
width: 200.0,
height: 200.0,
),
);
break;
case ConnectionState.active:
if (snapshot.data.isEmpty) {
return Container(
child: Text('empty'),
);
} else {
return ListView.builder(
.......
}
break;
default:
return Text("Error");
}
}))),
onWillPop: () {
Navigator.of(context).pop();
},
),
floatingActionButton: new FloatingActionButton(
elevation: 0.0,
child: new Icon(Icons.add),
onPressed: () {
Navigator.pushNamed(context, PageB.ROUTE).then((onValue) async{
_bloc.getList(context); // call this function once it is back from pageB
setState(() {});
});
}));
}
第一次加载页面A时,它将调用initState,并将列表成功填充到listView中。但是,如果我单击浮动操作按钮转到页面B,然后单击返回(Navigator.pop(context, true);
),则列表不会填充到listView中。它总是在等待中(保持显示loading.gif)。
答案 0 :(得分:0)
如果您要更新流本身,我认为不需要setState。
答案 1 :(得分:0)
这是我解决的方法。
在listen : false
中添加didChangeDependencies
。
@override
void didChangeDependencies() {
_bloc = Provider.of<Bloc>(context, listen: false);
super.didChangeDependencies();
}