【问题标题】:ConnectionState always waitingConnectionState 总是在等待
【发布时间】:2020-03-28 06:16:40
【问题描述】:

为什么connectionStatepageB返回时总是等待???

页面 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 我已经修好了。

标签: listview flutter dart


【解决方案1】:

如果您要更新流本身,我认为您不需要 setState。

【讨论】:

  • 所以解决方案是?
【解决方案2】:

我就是这样解决的。

didChangeDependencies 中添加listen : false

  @override
  void didChangeDependencies() {
    _bloc = Provider.of<Bloc>(context, listen: false);
    super.didChangeDependencies();
  }

【讨论】:

    猜你喜欢
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    相关资源
    最近更新 更多