如何使用新未来的结果更新FutureBuilder小部件?

时间:2019-01-30 17:57:57

标签: flutter

我有一个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');
  }
}

0 个答案:

没有答案