【问题标题】:How to get value from a async function and update in UI on any change?如何从异步函数中获取价值并在 UI 中更新任何更改?
【发布时间】:2021-10-19 15:36:10
【问题描述】:

我是 Flutter 的新手。我正在做一个项目,并使用 HIVE 进行本地存储,使用 Provider 进行状态管理。我做了一个购物车部分,我将所有添加到本地存储的购物车中的菜串起来,我想在该屏幕上显示购物车的总量。这是我的 HIVE 对象:

@HiveType(typeId: 0)
class DishHive extends HiveObject {

 DishHive({
required this.dishId,
required this.dishName,
required this.dishDescription,
required this.dishImage,
required this.dishPrice,
this.quantity,
});

@HiveField(0)
String dishId;

@HiveField(1)
String dishName;

@HiveField(2)
String dishDescription;

@HiveField(3)
List<int> dishImage;

@HiveField(4)
int dishPrice;

@HiveField(5)
int? quantity;}

我还创建了一个提供程序类的函数,它将帮助我使用 HIVE 进行 CRUD 操作,以及一个为我提供购物车总数的函数。

class CartFunctions extends ChangeNotifier {
 int Total = 0;
 List<DishHive> cartItems = [];

void setTotal(int total) {
Total = total;
}

void onChange() {
notifyListeners();
}
getCartTotal() async {
List<DishHive> listDish = [];
int TotalofCart = 0;
final box = await Hive.openBox<DishHive>('toCart');

listDish = box.values.toList();

listDish.forEach((element) {
  TotalofCart = TotalofCart + (element.dishPrice * element.quantity!);
});
print('Total: $TotalofCart');
setTotal(TotalofCart);
//notifyListeners();
return Total;
} 

下面是我要获取总数的地方。

trailing: FutureBuilder<dynamic>(
                      future: cartObj.getCartTotal(),
                      builder: (BuildContext context,
                          AsyncSnapshot<dynamic> snap) {
                        if (snap.connectionState ==
                            ConnectionState.active) {
                          return CircularProgressIndicator(
                            color: const Color(0xFF265cff),
                          );
                        } else if (snap.hasData) {
                          print('Final Total: ${snap.data}');
                          return Text(snap.data.toString());
                        }
                        return Text('0');
                      },
                    ),

我面临的问题是在第二个代码 sn-p 中声明的总值始终保持为 0。它只在 getCartTotal 函数内给我总值,但只有在我更新后才会在 UI 中更新来回刷新或切换页面。我要实时更新。 我也是 Stack Overflow 的新手,如果我在某个地方错了,请告诉我。 提前致谢。

【问题讨论】:

    标签: flutter flutter-dependencies


    【解决方案1】:

    所以问题是你不断地打电话给cartObj.getCartTotal(),因为树正在重建,这正在重置你的总数,而未来建设者的未来永远不会得到解决。您希望将未来存储在状态中并监控未来,而不是直接在构建方法中调用它。

    class _SomeWidgetState extends State<SomeWidget> {
      /// state variable for storing the future
      Future<int>? cartTotal;
    
      @override
      void initState() {
        super.initState();
    
        /// store the future in state
        cartTotal = cartObj.getCartTotal();
      }
    
      @override
      Widget build(BuildContext context) {
        return FutureBuilder<dynamic>(
          /// use the stored future with the future builder...
          future: cartTotal,
          builder: (BuildContext context, AsyncSnapshot<dynamic> snap) {
            if (snap.connectionState == ConnectionState.active) {
              return CircularProgressIndicator(
                color: const Color(0xFF265cff),
              );
            } else if (snap.hasData) {
              print('Final Total: ${snap.data}');
              return Text(snap.data.toString());
            }
            return Text('0');
          },
        );
      }
    }
    

    【讨论】:

    猜你喜欢
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    相关资源
    最近更新 更多