即使我测试数据正确,Flutter Provider也不会更新我的小部件?

fenchai

问题:我正在尝试构建从JSON文件获取数据的小部件,但是我不确定为什么提供程序没有更新小部件。(调试时没有错误,只是小部件上没有更新。)

这是应该显示JSON数据的小部件。

class CatalogPage extends StatefulWidget {
  @override
  _CatalogPageState createState() => _CatalogPageState();
}

class _CatalogPageState extends State<CatalogPage>
    with AutomaticKeepAliveClientMixin {
  @override
  bool get wantKeepAlive => true; // needed for keepAlive

  @override
  Widget build(BuildContext context) {
    super.build(context); // needed for keepAlive
    bool _loading = Provider.of<Screen1Provider>(context, listen: true).getLoading;
    List _catalogItems =
        Provider.of<Screen1Provider>(context, listen: false).getCatalogItems;
    return Scaffold(
        body: _loading == true
            ? Center(
                child: CircularProgressIndicator(),
              )
            : ListView.builder(
                itemCount: _catalogItems.length,
                itemBuilder: (context, index) {
                  return Card(
                    child: ListTile(
                      title: Text(_catalogItems[index].code.toString()),
                    ),
                  );
                },
              ));
  }

  @override
  void initState() {
    print('hi from catalogPage!');
    Screen1Provider().updateJsonCatalog();
    super.initState();
  }
}

这是上述小部件的提供者数据

class Screen1Provider with ChangeNotifier {
  int _catalogPageIndex = 1;
  int _medidasPageIndex = 0;
  List _itemsCatalog = [];
  List _itemsMedidas = [];
  List _itemsExcluded = [];
  bool _loading = true;

  int get getCatalogPageIndex => _catalogPageIndex;

  bool get getLoading => _loading;

  void setLoading(bool boolean) {
    _loading = boolean;
    notifyListeners();
  }

  void setCatalogPageIndex(int index) {
    _catalogPageIndex = index;
    notifyListeners();
  }

  void setItemsCatalog(data) {
    _itemsCatalog = data;
    print('> setItemsCatalog');
    print(_itemsCatalog[0].code); //printing correctly here as well
    getItemsCatalog;
  }

  List get getItemsCatalog {
    print('> getItemsCatalog');
    if (_itemsCatalog.length > 0) {
      print(_itemsCatalog[0].desc); //printing correctly here as well
    }
    return _itemsCatalog;
  }

  void setItemsMedidasGroup(data) {
    // _itemsMedidas.addAll(data);
    // _itemsMedidas = data;
  }

  void setItemsExcluded(data) {
    // _itemsExcluded.addAll(data);
    // _itemsExcluded = data;
  }

  void updateJsonCatalog() {
    print('updating catalog');
    setLoading(true);
    _itemsCatalog.clear();
    _itemsMedidas.clear();
    _itemsExcluded.clear();

    getJsonCatalog().then((data) {
      setItemsCatalog(data[0]);
      // setItemsMedidasGroup(data[1]);
      // setItemsExcluded(data[2]);
      setLoading(false);
      print('> is loading?: $_loading');
    });
  }

  // Function to get catalog in json
  Future<List> getJsonCatalog() async {
    print('trying to download catalog...');
    List _returnList = [];
    String _url =
        'https://www.dropbox.com/s/qubo8rigrkkvnqm/DummyJsonTest.json?dl=1';
    try {
      var r = await http.get(_url);

      var jsonData = json.decode(r.body);

      // this is used to prevent Price error when it's empty
      // messes up with double.parse formulas
      String tempPrice;

      for (var header in jsonData) {
        if (header["CODIGO"] == '') {
          // skip if empty
          continue;
        }
        if (header["PRECIO"] == '') {
          tempPrice = '0.00';
        } else {
          tempPrice = header["PRECIO"];
        }
        CatalogItems item = CatalogItems(
          header["CODIGO"],
          header["DESCRIPCION"],
          header["INVENT"],
          double.parse(tempPrice).toStringAsFixed(2).toString(),
          header["COD.ALT."],
          header["DESC.ALT."],
          header["GRUPO"],
          (double.parse(tempPrice) * 0.8).toStringAsFixed(2).toString(),
        );
        // only add if item in CatalogItems.groups
        if (CatalogItems.groups.contains(header["GRUPO"])) {
          _itemsCatalog.add(item);
        } else if (CatalogItems.medidaGroups.contains(header["GRUPO"])) {
          _itemsMedidas.add(item);
        } else {
          _itemsExcluded.add(item);
        }
      }
    } catch (e) {
      print('error');
      print(e);
    } finally {
      // this triggers even if catalog failed to download
    }
    // below will NOT trigger if an error was catched
    print('no errors while downloading JSON');
    print('${_itemsCatalog[0].code}|${_itemsCatalog[0].desc}|${_itemsCatalog[0].price}'); // prints correctly here
    _returnList = [_itemsCatalog, _itemsMedidas, _itemsExcluded];
    return _returnList;
  }
}

请告诉我是否有更好的方法可以做到这一点,因为我只是在了解提供者。

编辑:项目的链接[ https://www.dropbox.com/sh/k8​​v8d730p0qmbvl/AABG1jcPC_Zpu7O2yLk_idmxa?dl=0][1]如果有错误,请注释掉pubspec.yaml文件上的资产。

EDIT2:向项目添加了虚拟json数据链接,因此可以随时运行它。否则,这是json数据:

[{“” CODIGO“:” 13271190“,” DESCRIPCION“:” A / A CHE TRAX 13- GITY 2014-
SONI 13396514 95152912 52420930 CUK2”,“ INVENT”:“ 890”,“ PRECIO”:“ 3.54”,“ COD.ALT。”:“ AC9205”,“ DESC.ALT。”:“”,“ GRUPO”:“ 10 .FILTRO A / A“},{” CODIGO“:” 27274-7J125 SET“,” DESCRIPCION“:” A / A NIS PATHFINDER NEW 2015-2PC 27275-1N605“,” INVENT“:” 637“,” PRECIO“ :“ 4.42”,“ COD.ALT。”:“ AC2503 SET”,“ DESC.ALT。”:“”,“ GRUPO”:“ 10.FILTRO A / A”},{“ CODIGO”:“ 27274-EA000 SET”,“ DESCRIPCION”:“ A / A NIS FRONTIER VQ40 YD25 PATHFIADER D40 VITARRA J20 27274-EL00A 27277-4JA0A”,“ INVENT”:“ 1072”,“ PRECIO”:“ 4.25”,“ COD.ALT”。 ”AC2507SET”,“ DESC.ALT。”:“ 27277-4JA0A GRAN VITARRA J20”,“ GRUPO”:“ 10.FILTRO A / A”},{“ CODIGO”:“ 27274-EB700-F SET”,“ DESCRIPCION” :“ A / A NIS NAVARA D40T DELGADA 2 PCS CA18320”,“ INVENT”:“ 1117”,“ PRECIO”:“ 4.22”,“ COD.ALT。”:“ AC22005 SET”,“ DESC.ALT。”:“ “,” GRUPO“:” 10.FILTRO A / A“},{” CODIGO“:” 27275-1N601“,” DESCRIPCION“:” A / A NIS FRONTIER VQ25D -02 QG 16 ZD30 QD32“,” INVENT“: “ 314”,“ PRECIO”:“ 4.95”,“ COD.ALT。”:“ AC2502SET”,“ DESC.ALT。”:“”,“ GRUPO”:“ 10.FILTRO A / A”}},{“ CODIGO “:” 27277-00A26“,”DESCRIPCION”:“ A / A NIS TIIDA C13 HR16 15- JUKE 2015- HR16DE VERSA 27277-1KA0A”,“ INVENT”:“ 2061”,“ PRECIO”:“ 3.65”,“ COD.ALT。”:“ AC0182”, “ DESC.ALT。”:“”,“ GRUPO”:“ 10.FILTRO A / A”},{“ CODIGO”:“ 27277-1HA0A”,“ DESCRIPCION”:“ A / A NIS QASHQAI 13- VERSA 14- 3月13日-ALMERA 11- K1267 27277-4BA0A”,“ INVENT”:“ 1777”,“ PRECIO”:“ 3.82”,“ COD.ALT。”:“ AC2513”,“ DESC.ALT。”:“”,“ GRUPO”:“ 10.FILTRO A / A”},{“ CODIGO”:“ 27277-1KK0A”,“ DESCRIPCION”:“ A / A NIS VERSA 2015- HOT”,“ INVENT”:“ 2642”,“ PRECIO” :“ 4.95”,“ COD.ALT。”:“”,“ DESC.ALT。”:“”,“ GRUPO”:“ 10.FILTRO A / A”}},{“ CODIGO”:“ 27277-3JC1B”,“ DESCRIPCION”:“ A / A NI MURANO 14- PATHFINDER 2013- QR25D ALTIMA 12-“,” INVENT“:” 451“,” PRECIO“:” 4.65“,” COD.ALT。“:” AC0208“,” DESC.ALT。“:”“,” GRUPO“: “ 10.FILTRO A / A”},{“ CODIGO”:“ 27277-4BA0A”,“ DESCRIPCION”:“ A / A NIS XTRAIL 13- RENAULT CA18361 27277-1HA0A”,“ INVENT”:“ 426”,“ PRECIO “:” 3.71“,” COD.ALT。“:” A2514“,” DESC.ALT。“:”“,” GRUPO“:” 10.FILTRO A / A“},{” CODIGO“:” 27277-4KH0A ”,“ DESCRIPCION”:A / A NI URBAN NV350 12- PASTROL 10- PATHFHANER 16- OF”,“ INVENT”:“ 1420”,“ PRECIO”:“ 3.89”,“ COD.ALT。”:“ 27277-5JJ0A”,“ DESC.ALT” 。“:”“,” GRUPO“:” 10.FILTRO A / A“}]

Edit3:改进了调试打印,已验证的布尔触发器正确。但是小部件仍未更新(CircularProgressIndicator()仅应在布尔值为false时显示,但它会一直旋转)

I/flutter ( 5948): hi from catalogPage!
I/flutter ( 5948): updating catalog
I/flutter ( 5948): trying to download catalog...
I/flutter ( 5948): > getItemsCatalog
I/flutter ( 5948): no errors, done
I/flutter ( 5948): 13271190|A/A CHE TRAX 13- GITY 2014-   SONI  13396514   95152912  52420930 CUK2|3.54
I/flutter ( 5948): > setItemsCatalog
I/flutter ( 5948): 13271190
I/flutter ( 5948): > getItemsCatalog
I/flutter ( 5948): A/A CHE TRAX 13- GITY 2014-   SONI  13396514   95152912  52420930 CUK2
I/flutter ( 5948): > is loading?: false
威廉·特里尔

错误出现在CatalogPage()类的这段代码中:

  void initState() {
    print('hi from catalogPage!');
    Screen1Provider().updateJsonCatalog();  // <----- The culprit
    super.initState();
  }

我发现它的方法是将一个构造函数添加到Screen1Provider中,如下所示:

Screen1Provider(){
   print("***started provider***");
}

而且我注意到该行被打印了两次……并且第一次使用提供程序后,实例化了一次。

当您调用Screen1Provider()。updateJsonCatalog()时,它在main.dart文件中的ChangeNotifierProvider()之外创建了一个ScreenProvider的新实例。这就是中断notifyListeners调用的原因。为了调用代码,您需要运行:

Provider.of<Screen1Provider>(context, listen: false).updateJsonCatalog();

在那之后,代码可以正常工作……很好……还有一些机会,但是我能够看到: 在此处输入图片说明

哇。那真是一个微妙的错误!(我还了解了一些有关您的代码的信息……所以它一直都是双赢的!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我应该如何更新我的小部件?

来自分类Dev

让我的主干视图加载测试数据?

来自分类Dev

滚动时小部件数据不会更新-Swift

来自分类Dev

滚动时小部件数据不会更新-Swift

来自分类Dev

Flutter更新小部件

来自分类Dev

为什么我们必须从一个小部件更新多个小部件?

来自分类Dev

我收到错误消息:在此设置小部件上方找不到正确的Provider <User>(已修复)

来自分类Dev

我的android主屏幕小部件出现了,但没有更新

来自分类Dev

Flutter-在小部件功能内切换不会更新

来自分类Dev

我如何包装此文本,以使它不会超出小部件容器而溢出?

来自分类Dev

time.sleep()方法是否不会使我的小部件出现?

来自分类Dev

测试驱动开发-我应该测试数据库列和索引吗?

来自分类Dev

我可以对训练和测试数据使用假设测试吗?

来自分类Dev

我可以通过更改测试数据来调用不同的TestNG测试吗?

来自分类Dev

重新加载无状态小部件后,我应该如何更新?

来自分类Dev

如何在小部件中的按钮单击上更新我的TextView?

来自分类Dev

Flutter更新文本小部件

来自分类Dev

在此ModalBottomSheet小部件上方找不到正确的Provider <X>

来自分类Dev

在此ServerList小部件上方找不到正确的Provider <ServerResponse>

来自分类Dev

线性回归测试数据违反训练数据。请解释我哪里出错了

来自分类Dev

基本角度材料表显示测试数据,但不显示我的数据

来自分类Dev

为什么Flutter的SpannableGrid小部件中的UI不会刷新以使用String流中的最新内容进行更新?

来自分类Dev

获取我的主屏幕小部件的大小

来自分类Dev

我应该怎么称呼这个小部件?

来自分类Dev

我需要ModelMultipleChoiceField的“原始ID”小部件

来自分类Dev

定位的小部件与我的CustomScrollView重叠

来自分类Dev

我的天气小部件无法正常工作

来自分类Dev

我的小部件背景消失了-Android

来自分类Dev

我应该怎么称呼这个小部件?

Related 相关文章

  1. 1

    我应该如何更新我的小部件?

  2. 2

    让我的主干视图加载测试数据?

  3. 3

    滚动时小部件数据不会更新-Swift

  4. 4

    滚动时小部件数据不会更新-Swift

  5. 5

    Flutter更新小部件

  6. 6

    为什么我们必须从一个小部件更新多个小部件?

  7. 7

    我收到错误消息:在此设置小部件上方找不到正确的Provider <User>(已修复)

  8. 8

    我的android主屏幕小部件出现了,但没有更新

  9. 9

    Flutter-在小部件功能内切换不会更新

  10. 10

    我如何包装此文本,以使它不会超出小部件容器而溢出?

  11. 11

    time.sleep()方法是否不会使我的小部件出现?

  12. 12

    测试驱动开发-我应该测试数据库列和索引吗?

  13. 13

    我可以对训练和测试数据使用假设测试吗?

  14. 14

    我可以通过更改测试数据来调用不同的TestNG测试吗?

  15. 15

    重新加载无状态小部件后,我应该如何更新?

  16. 16

    如何在小部件中的按钮单击上更新我的TextView?

  17. 17

    Flutter更新文本小部件

  18. 18

    在此ModalBottomSheet小部件上方找不到正确的Provider <X>

  19. 19

    在此ServerList小部件上方找不到正确的Provider <ServerResponse>

  20. 20

    线性回归测试数据违反训练数据。请解释我哪里出错了

  21. 21

    基本角度材料表显示测试数据,但不显示我的数据

  22. 22

    为什么Flutter的SpannableGrid小部件中的UI不会刷新以使用String流中的最新内容进行更新?

  23. 23

    获取我的主屏幕小部件的大小

  24. 24

    我应该怎么称呼这个小部件?

  25. 25

    我需要ModelMultipleChoiceField的“原始ID”小部件

  26. 26

    定位的小部件与我的CustomScrollView重叠

  27. 27

    我的天气小部件无法正常工作

  28. 28

    我的小部件背景消失了-Android

  29. 29

    我应该怎么称呼这个小部件?

热门标签

归档