首页 > 解决方案 > 在 Flutter 中从 FutureBuilder 设置状态

问题描述

我一直在尝试根据 a 的响应设置属性,FutureBuilder但似乎无法使其正常工作。_activityLength未来解决后如何设置而不在构建期间设置?

FutureBuilder<QuerySnapshot>(
            future: _future,
            builder: (BuildContext context,
                AsyncSnapshot<QuerySnapshot> snapshot) {
              switch (snapshot.connectionState) {
                case ConnectionState.none:
                  return Text('Press button to start');
                case ConnectionState.waiting:
                  return Center(
                    child: CircularProgressIndicator(),
                  );
                default:
                  if (snapshot.hasError) {
                    return Text('Error: ${snapshot.error}');
                  } else {
                    final documents = snapshot.data.documents;

                    _activityLength = documents.length;

                    return Expanded(
                      child: ListView.separated(
                        shrinkWrap: true,
                        separatorBuilder: (context, index) => Divider(
                          color: Colors.black,
                          height: 0,
                        ),
                        itemCount: documents.length,
                        itemBuilder: (context, index) => _activityTile(
                          documents[index],
                        ),
                      ),
                    );
                  }
              }
            },
          )

位于主体中FutureBuilde的小部件中,我需要设置的值位于类似这样的东西中:ColumnScaffold_itemsHeaderText

body:
   ...

                  child: Column(
                    children: <Widget>[
                      Container(
                        width: double.infinity,
                        decoration: BoxDecoration(
                          border: Border(
                            bottom:
                                BorderSide(color: Colors.grey, width: 1.0),
                          ),
                        ),
                        child: Padding(
                          padding: const EdgeInsets.only(
                              left: 15.0,
                              right: 15.0,
                              top: 10.0,
                              bottom: 10.0),
                          child: _itemsHeaderText(),
                        ),
                      ),
                      _itemsBody(),
                    ],
                  ),

标签: flutter

解决方案


您的问题有一些解决方法。

  1. 您可以将 futureBuilder 提升到小部件树上,而不是设置状态,一旦 ConnectionState.done 状态将被重置。
  2. 您可以将未来放在一个在初始化状态下调用的函数中,然后将未来的结果放在上面设置状态。

推荐阅读