Flutter - Futurebuilder 仅在重新加载后显示数据

Flutter - Futurebuilder showing data only after reload

我正在使用 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'); 直到重新加载才执行。

future: Provider.of<SurveyUtils>(context, listen: false)
                .fetchSurvey(context),

您不应该在构建方法中创建 未来。您的构建方法可以被调用很多很多次,您不想仅仅因为有人调整了浏览器 window 或将设备切换为横向模式就再次 获取调查。

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

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

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

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