Android 听者的奇怪行为

Android 听者的奇怪行为,android,flutter,dart,Android,Flutter,Dart,我有一个从服务器获取的列表,但是当我们在获取方法之外时,列表被初始化为默认值。我注意到问题在于notifyListeners,如下所示: 有趣的是,在抓取方法中,列表是ok的 class Products with ChangeNotifier { List<Product> _loadedProducts = []; Future<void> fetchAndSetProducts() async { try { var respons

我有一个从服务器获取的列表,但是当我们在获取方法之外时,列表被初始化为默认值。我注意到问题在于notifyListeners,如下所示:

有趣的是,在抓取方法中,列表是ok的

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;
    }
  }


你有一个逻辑错误。检查我的评论

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;
    }
  }

我说得对吗?我想你犯了那个错误

我有更好的款式的建议。我们可以在产品构造函数中调用fetchAndSetProducts,而不是处理didChangeDependencies。看这里
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;
    }
  }