1

我正在尝试从检索地图的 api 调用中获取数据,我能够从 api 获取地图以显示我想要的方式,但是它反复调用 api 意味着列表不断刷新。即使我尝试将侦听器设置为 false,它也可以工作,但我必须手动刷新应用程序才能工作?

附加信息:分配和检索数据


import 'package:http/http.dart' as http;

class Stores with ChangeNotifier {

  var s_length;

  Future<List<Store>> getStores(String storeCatName) async {
    final queryParameters = {
      "store_category_name": storeCatName,
    };
    try {
      //TODO this is the issue - must fix.
      final uri = Uri.http("url", 'url', queryParameters);
      //print(uri);
      final response = await http.get(uri);
      //print(response.statusCode);
      //print(response.body);
      if (response.statusCode == 200) {
        final List<Store> stores = storeFromJson(response.body);
        _stores = stores;
        //print(_stores);
        print("lenght: ${_stores.length}");
        Store store;
        for(store in _stores) {
          store.products = Products().products(store.storeId);
        }
        //check if this is correct
        notifyListeners();
        //return stores;

      } else {
        print("error1");
        return List<Store>();
      }
    } catch (e) {
      print(e.toString());
      return List<Store>();
    }
    //notifyListeners();
    print(_stores);
  }

  List<Store> get favoriteItems {
    //return _stores.where((storeItem) => storeItem.isFavorite).toList();
  }

  bool isNotFull(){
    if (_stores.isEmpty){
      return true;
    } else {
      return false;
    }
  }

  int get numberOfStores{
    return s_length;
  }

  List<Store> _stores = [];

  List<Store> stores (String storeCatName){

    getStores(storeCatName);
    //print("cpp; + $s_length");
    //notifyListeners();
    return _stores;
  }

}

 final storesProvider = Provider.of<Stores>(
      context, listen: false
    );

    storesProvider.getStores(categoryName);

    final providerStoreList = storesProvider.stores(category.storeCategoryName);

附加信息:列表生成器:

child: ListView.builder(
            itemCount: providerStoreList.length,
            itemBuilder: (context, index) => ChangeNotifierProvider.value(
                  value: providerStoreList[index],
                  child: StoreItem(),
                )));

如果需要任何其他信息,请告诉我。任何帮助将不胜感激。

谢谢

4

2 回答 2

0

利用

听:假的;

   var ourClient = Provider.of<CartBlock>(context, listen: false);
于 2021-02-08T05:28:01.670 回答
0

将侦听器设置为 false 意味着在调用 notifyListeners() 时您的小部件不会再次构建。

所以,这可能不是问题。

我能想到的唯一原因是从 build 方法再次调用 API,如果您使用 ListView 构建器,可能会发生这种情况。因此,每次您可能滚动 ListView 时,您的 API 都会再次调用。

于 2021-02-08T06:39:41.153 回答