ValueNotifier 的 valuelistenablebuilder<Map<dynamic, dynamic>>

问题描述 投票:0回答:3

我发现我们无法使用 valuestatebuilder 刷新类的状态。这对我来说是非常不幸的。因为经过几周的努力,我终于即将完成我的第一个 flutter 应用程序/

问题:我想更新主类的状态。地图存储在另一个中。我已经尝试过: setstate 和 valuenotifier 但都是徒劳的。有人可以告诉我如何克服这个问题以及如何使用listenablebuilder来更新主类吗?谢谢。

示例代码:

// class where the map<> is located.
// totalBill is the variable i want to use the value of in the next class
    var totalBill = ValueNotifier({});
    Map billl = {};
    int temp = 0;
    
    class ReusableCard extends StatefulWidget {
      ReusableCard({
        required this.itemName .....
...
...
// down in the class:
return GestureDetector(
      onTap: () {

        setState(() {
          totalBill.value[widget.itemName] = temp;
        });
      },

然后在下一堂课:

ValueListenableBuilder<Map>(
// totalBill is being borrowed from the above example / class 
                    valueListenable: totalBill,
                    builder: (context, val, _) {
                      //print(val);
                      //print(itemsInList);

                      return Column(
                        children: [
                          Text(val.toString()),
.... 
...

我将不胜感激任何帮助。

flutter dart
3个回答
4
投票

ValueNotifier 仅在值更改时发出通知。对于Map,值是参考值。如果里面的值改变了,它也不会改变。

修复

onTap
函数更改为以下

onTap((){

  totalBill.value[widget.itemName] = temp; // or change the value to whatever you want   
  totalBill.notifyListeners() // this notifies to all the listeners. 

});

了解更多:https://github.com/flutter/flutter/issues/29958


1
投票

ValueNotifier
仅在value
更改
时通知。在您的示例中,您不会更改 value
 (即 
Map
),但您 
必须

正确的代码是:

setState(() { totalBill.value = {widget.itemName: temp}; });
    

0
投票
如 Dart 官方文档中的

example 所示,在这种情况下,您可以使用 ChangeNotifier 子类来封装 Map

,并在 
Map
 中添加或删除项目时通知客户端。

© www.soinside.com 2019 - 2024. All rights reserved.