notifyListener的奇怪行为

时间:2019-08-21 14:41:12

标签: android flutter dart

我有一个从服务器获取的列表,但是当我们超出获取方法的范围时,该列表将初始化为默认值。我注意到问题出在notifyListeners()上,如下所示: Does notifyListeners() sometimes complete asynchronously?

有趣的是,在获取方法内部,列表没有问题。

class Products with ChangeNotifier {

  List<Product> _loadedProducts = [];

  Future<void> fetchAndSetProducts() async {
    try {
      var response =
          await http.get(StoreServer.serverAddress + '/products.json');

      final extractedData = json.decode(response.body) as Map<String, dynamic>;
      List<Product> extractedList = [];
      extractedData.forEach((key, value) {
        _loadedProducts.add(Product(
            id: key,
            imageUrl: value['imageUrl'],
            title: value['title'],
            price: value['price'],
            description: value['description'],
            isFavorite: value['isFavorite']));
      });
      _loadedProducts = extractedList;
      notifyListeners();
      await Future.delayed(Duration(seconds: 1));
    } catch (error) {
      throw error;
    }
  }

 @override
  void didChangeDependencies() {
    if (!isInit) {
      setState(() {
        isLoading = true;
      });
      test = Provider.of<Products>(context);
      test.fetchAndSetProducts().then((_) {
        print("fetched");
        setState(() {
          isLoading = false;
          isInit = true;
        });
      });
    }
    super.didChangeDependencies();
  }

1 个答案:

答案 0 :(得分:1)

您有逻辑错误。检查我的评论..!

class Products with ChangeNotifier {

  List<Product> _loadedProducts = [];

  Future<void> fetchAndSetProducts() async {
    try {
      var response =
          await http.get(StoreServer.serverAddress + '/products.json');

      final extractedData = json.decode(response.body) as Map<String, dynamic>;
      List<Product> extractedList = []; // it is an empty list
      extractedData.forEach((key, value) {
        _loadedProducts.add(Product(    // you add elements to _loadedProducts 
            id: key,
            imageUrl: value['imageUrl'],
            title: value['title'],
            price: value['price'],
            description: value['description'],
            isFavorite: value['isFavorite']));
      });
      _loadedProducts = extractedList; // you reassign _loadedProducts to the empty list "extractedList"
      notifyListeners();
      await Future.delayed(Duration(seconds: 1));
    } catch (error) {
      throw error;
    }
  }

我是对的吗?我认为您有那个错误!