【发布时间】:2020-03-28 06:16:40
【问题描述】:
为什么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,list成功填充到listView。但是,如果我单击浮动操作按钮转到页面 B,然后单击返回 (Navigator.pop(context, true);),则列表不会填充到 listView。它总是在等待(保持显示 loading.gif)。
【问题讨论】:
-
请发布一个最小的可重现代码。
-
好吧,如果没有更多您正在使用的代码,很难判断这里发生了什么 - 您是否验证了 A) _bloc.getList(context) 在导航器被推送后实际上被调用; B)实际上正在调用流构建器,并且 C)从流返回的列表实例是不同的列表,即使它只是最后一个列表的直接副本 - 如果它是同一个对象,则可以想象它可能不会正确触发 ListView 的重建。但是一个最小的代码示例会更有帮助。
-
@rmtmckenzie 我已经修好了。