我有一个futureBuilder小部件,用于显示数据库中的记录,并且正在从异步将来的网络请求中获取这些记录。有一些choiceChip小部件可以通过onSelected为FutureBuilders的未来分配新的未来。
第一次单击choiceChip时,将调用并创建新的Future,但是显示的记录不会更新。如果再次单击相同的选择芯片,则记录将更新并正确显示。
为什么即使正确地调用和分配了新的Future,futureBuilder为什么也不会在choiceChip的第一次单击上更新?
更新:我从将来切换到流,并添加了检查以查看ConnectionState是否完成。看来已经成功了。
class _HousingFeedState extends State<HousingFeed> with AutomaticKeepAliveClientMixin<HousingFeed> {
Future<List<Housing>> _future;
@override
void initState() {
super.initState();
_future = housingFeed(0, "");
}
Widget _chipRow = new Container(
child: SingleChildScrollView(
child: Row(
children: List<Widget>.generate(
5,
(int index) {
return Padding(
padding: EdgeInsets.only(left: 5.0),
child: ChoiceChip(
selected: _housingType == index,
onSelected: (bool selected) {
setState(() {
_housingType = index;
_future = housingFeed(subcategoryMap[index], '');
});
},
),
);
},
).toList(),
),
),
);
Widget housingBuilder = FutureBuilder<List<Housing>>(
future: _future,
builder: (context, snapshot) {
...
}
);
}
Future<List<Housing>> housingFeed(int subcategoryId, String search) async {
String url = "https://...";
final response = await http.post(url,
headers: {HttpHeaders.contentTypeHeader: 'application/json'},
body: jsonEncode({
"id": userId,
"filter": {"id": subcategoryId},
"search": search
}));
if (response.statusCode == 200) {
var housingListings = List<Housing>();
var jsonData = json.decode(response.body);
jsonData['response'].forEach((listing) {
housingListings.add(Housing.fromJson(listing));
});
return housingListings;
} else {
throw Exception('Failed to load');
}
}