微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当我在 Flutter 中使用 provider 包将数据从 API 加载到列表中时,它会重复调用 API,我该如何解决?

如何解决当我在 Flutter 中使用 provider 包将数据从 API 加载到列表中时,它会重复调用 API,我该如何解决?

我正在尝试从检索地图的 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(),)));

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

谢谢

解决方法

使用

听:假;

   var ourClient = Provider.of<CartBlock>(context,listen: false);
,

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

所以,这可能不是问题。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。