【问题标题】:FutureBuilder does not complete when using an Anmiation inside在内部使用动画时,FutureBuilder 未完成
【发布时间】:2021-06-20 15:10:32
【问题描述】:

我有一个 FutureBuilder,用于从 Firestore 中检索数据。正如这里经常建议的那样,我在 initState 中执行此操作。

Future<Tour> _tour;

  @override
  void initState() {
    super.initState();
    _tour = _tourService.getTourDataPerEmployee(employeeID: userinfo.user.uid);
  }

我的 FutureBuilder 如下所示:

FutureBuilder(
        future: _tour,
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            print(snapshot.data.waypoints);
            return Container(
                child: ListView.builder(
              itemCount: snapshot.data.waypoints.length,
              itemBuilder: (context, index) {
                return TimelineTile(
                  nodePosition: 0.03,
                  contents: TourTile(
                    tour: snapshot.data,
                    index: index,
                  ),
                  node: TimelineNode(
                    indicator: CustomIndicator(
                        finished: snapshot.data.waypoints[index].finished),
                    startConnector: CustomConnector(
                        finished: snapshot.data.waypoints[index].finished,
                        inProgress: false),
                    endConnector: CustomConnector(
                        finished: snapshot.data.waypoints[index].finished,
                        inProgress: index >= snapshot.data.waypoints.length - 1
                            ? true
                            : snapshot.data.waypoints[index + 1].finished
                                ? false
                                : true),
                  ),
                );
              },
            ));
          } else {
            return Center(child: Text("Please wait"));
          }
        },
      ),

这就是我尝试添加动画的方式:

CircularProgressIndicator()

这很好用,但是当我尝试用动画替换简单的文本(“请稍候”)时,我得到了奇怪的结果。我无法从未来得到任何结果,有时只有几个结果。数据有时似乎根本没有到达,因为 snapshot.data 有时会打印 null ,有时所有结果都在那里。我看不到动画和构建器之间的任何连贯性。

【问题讨论】:

  • 分享您如何尝试实现导致意外行为的动画可能会有所帮助。在您的 initState 中,在 tourService 之前尝试 await
  • @Loren.A 我添加了详细信息

标签: firebase flutter dart flutter-futurebuilder flutter-future


【解决方案1】:

试试这个:

Future<Tour> _tour;
  
  getTours() async {
    return await _tourService.getTourDataPerEmployee(employeeID: userinfo.user.uid);

  }

  @override
  void initState() {
    super.initState();
    _tour = getTours();
  }

然后在小部件中:

FutureBuilder(
        future: _tour,
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            print(snapshot.data.waypoints);
            return Container(
                child: ListView.builder(
              itemCount: snapshot.data.waypoints.length,
              itemBuilder: (context, index) {
                return TimelineTile(
                  nodePosition: 0.03,
                  contents: TourTile(
                    tour: snapshot.data,
                    index: index,
                  ),
                  node: TimelineNode(
                    indicator: CustomIndicator(
                        finished: snapshot.data.waypoints[index].finished),
                    startConnector: CustomConnector(
                        finished: snapshot.data.waypoints[index].finished,
                        inProgress: false),
                    endConnector: CustomConnector(
                        finished: snapshot.data.waypoints[index].finished,
                        inProgress: index >= snapshot.data.waypoints.length - 1
                            ? true
                            : snapshot.data.waypoints[index + 1].finished
                                ? false
                                : true),
                  ),
                );
              },
            ));
          } else {
            return CircularProgressIndicator();
          }
        },
      ),

你甚至可以在未来调用 getTours()

FutureBuilder(
        future: getTours(),

【讨论】:

  • 就像一个魅力!我只需要在 getTours 函数前面添加 Future 就可以了!
  • 是的,忘记了:)
猜你喜欢
  • 2022-08-16
  • 1970-01-01
  • 2019-10-08
  • 2023-03-10
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 2021-08-03
  • 2020-08-07
相关资源
最近更新 更多