【问题标题】:Flutter - Futurebuilder showing data only after reloadFlutter - Futurebuilder 仅在重新加载后显示数据
【发布时间】:2022-01-02 18:45:22
【问题描述】:

我正在使用future builder如下:

 FutureBuilder<List<SurveyModel>>(
                future: Provider.of<SurveyUtils>(context, listen: false)
                    .fetchSurvey(context),
                builder: (BuildContext context, AsyncSnapshot snapshot) {
                  if (snapshot.hasData) {
                    final List surveys = snapshot.data as List;
                    return ListView.builder(
                      shrinkWrap: true,
                      itemCount: surveys.length,
                      itemBuilder: (context, index) {
                        return surveyTile(
                          surveyModel: surveys[index] as SurveyModel,
                        );
                      },
                    );
                  }
                  return const Center(
                    child: Padding(
                      padding: EdgeInsets.symmetric(vertical: 100.0),
                      child: CircularProgressIndicator(),
                    ),
                  );
                },
              ),

未来功能如下:

Future<List<SurveyModel>> fetchSurvey(BuildContext context) async {
    print('fetch survey function call');
    List<SurveyModel> surveys = [];
    final String body = await Provider.of<HiveDB>(context, listen: false)
        .fetchData(boxName: 'surveys', title: 'surveys') as String;
    print('fetched');
    final data = json.decode(body)['data'] as List;
    surveys = data
        .map((survey) => SurveyModel.fromJson(survey as Map<String, dynamic>))
        .toList();
    print('done');
    return surveys;
  }

我只有在重新加载后才能从未来的构建器获取数据,除非我重新加载我只会得到循环进度指示器。同样print('fetch survey function call'); 直到重新加载才会执行。

【问题讨论】:

  • 改用streambuilder!
  • @Davis 你能解释一下为什么他们需要 StreamBuilder 吗?
  • 我没有看到您的代码有任何问题。从我从问题中得到的信息是,即使不刷新页面,您也想无缝获取数据?如果是这样,请使用 streamBuilder
  • 除非我颤振热重载,否则我不会获取数据

标签: flutter dart flutter-futurebuilder


【解决方案1】:
future: Provider.of<SurveyUtils>(context, listen: false)
                .fetchSurvey(context),

您不应该在构建方法中创建未来。您的构建方法可以被调用很多次,您不希望仅仅因为某人调整了浏览器窗口的大小或将他们的设备切换为横向模式而再次获取调查。

在您的状态中创建一个可以容纳这个未来的变量。然后将此变量设置在您的构建方法的外部。如果您没有像按钮这样的特定触发器,也许initState 是正确的地方。

在您的build 方法中,仅引用此变量。这样,如果您的构建方法被调用,您就不会一遍又一遍地触发您的 Future。

【讨论】:

    【解决方案2】:

    你需要在 build 方法之外创建一个变量,并在 setState 内的 void init() 中对其进行初始化。然后传入 FutureBuilder 的 future 参数。

    您可以查看以下教程: https://youtu.be/LYN46233cws

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 2022-01-08
      • 2023-04-04
      • 2021-02-06
      • 2013-11-13
      • 1970-01-01
      • 2015-09-07
      相关资源
      最近更新 更多