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
我正在使用 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