【问题标题】:Using a FutureBuilder in a Flutter stateful widget with RefreshIndicator在 Flutter 有状态小部件中使用 FutureBuilder 和 RefreshIndicator
【发布时间】:2023-04-01 14:45:01
【问题描述】:

我有一个 Flutter 小部件,它从服务器获取数据并呈现一个列表。得到数据后,我解析数据并在我的应用程序中将其转换为内部对象,所以函数是这样的:

Future<List<Data>> getData(Thing thing) async {
  var response = await http.get(Uri.parse(MY_URL));
  // do some processing
  return data;
}

之后,我定义了一个有状态的小部件,它调用这个函数并使用未来来呈现一个列表。

class DataList extends StatefulWidget {
  const DataList({Key key}) : super(key: key);

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

class _DataListState extends State<DataList> {
  Widget createListView(BuildContext context, AsyncSnapshot snapshot) {
    List<Data> values = snapshot.data;

    if (values.isEmpty) {
      return NoResultsWidget('No results.');
    }

    return ListView.builder(
      itemCount: values.length,
      itemBuilder: (BuildContext context, int index) {
        return values[index];
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    var data = getSomething().then((thing) => getData(thing));

    return FutureBuilder(
      future: data,
      builder: (BuildContext context, AsyncSnapshot snapshot) {
        switch (snapshot.connectionState) {
          case ConnectionState.none:
            return CustomErrorWidget('Error');
          case ConnectionState.waiting:
            return LoadingWidget();
          default:
            if (snapshot.hasError) {
              return CustomErrorWidget('Error.');
            } else {
              return createListView(context, snapshot);
            }
        }
      },
    );
  }
}

现在,代码以这种方式工作得很好。但是,当我尝试将我的数据移动为通过 initState 方法更新的类变量(Future 类型)时,该变量永远不会更新。示例代码如下:

class _DataListState extends State<DataList> {
  Future<List<Data>> data;

  ....

  @override
  void initState() {
    super.initState();
    updateData();
  }

  void updateData() {
    data = getSomething().then((thing) => getData(thing));
  }

  ....

}

我想添加一个刷新指示器以在刷新时更新数据,为此我需要使我的数据成为一个类变量以在刷新时对其进行更新,但我似乎无法弄清楚如何制作我的数据有状态小部件的状态的一部分并让它工作。任何有关 github 代码示例的帮助或指南都将不胜感激。

【问题讨论】:

    标签: flutter


    【解决方案1】:

    您需要将 data 变量的赋值包装在 setState 中,以便 Flutter 知道变量已更改并重建您的小部件。

    例如:

      void updateData() {
        setState(() {
            data = getSomething().then((thing) => getData(thing));
        });
      }
    

    【讨论】:

      猜你喜欢
      • 2021-04-17
      • 1970-01-01
      • 2019-07-13
      • 2020-02-19
      • 2020-07-29
      • 1970-01-01
      • 2019-09-23
      • 2019-06-10
      • 2020-08-25
      相关资源
      最近更新 更多