从Flutter中的子级小部件修改静态变量

问题描述

是否可以与所有孩子共享变量?并从那里修改它?

嗨,我的Flutter应用程序出现问题。我想创建一个全局变量,将其作为参数发送给模型的实例中的所有参数,如下所示:

  static double totalAmount = 0;
  Beer beer025 = new Beer(0.25,1,"025",totalAmount);
  Beer beer033 = new Beer(0.33,"033",totalAmount);
  Beer beer050 = new Beer(0.50,"050",totalAmount);
  Beer beer100 = new Beer(1.00,"100",totalAmount); 

每个对象都可以在构造函数的第一个参数中添加totalAmount变量。 (0.25,0.50 ...)。

然后我将此静态变量添加到我的UI中,以跟踪总数:

Container(
  padding: EdgeInsets.only(left: 5),child: Text(
    "$totalAmount",style: TextStyle(
      fontSize: 40,color: Theme.of(context).accentColor,fontWeight: FontWeight.bold,),

注意:当我直接在代码修改值时,我必须重新启动整个应用程序才能显示更改。

无论如何,当我进入模型时,我有一种方法可以更新对象本身的数量,并且它应该也可以更新totalAmount的值,但实际上并没有,相反,它显然为每个对象创建了totalAmount而不是使用所有这些都是静态的。

代码

class Beer {
  double cuantity;
  int amount;
  double price;
  String image;
  double totalAmount;

  Beer(this.cuantity,this.amount,this.price,this.image,this.totalAmount);

  //////////////////////////////////////
  // Add and remove beer from the amount
  addBeerAmount(int amountToAdd) {
    this.amount += amountToAdd;
    // Here we update it
    this.totalAmount += this.cuantity * amountToAdd;
    print("Adding to beer " +
        this.cuantity.toString() +
        " // " +
        amountToAdd.toString());
    print("Total:" + this.totalAmount.toString());
  }

输出

I/Flutter ( 3457): Adding to beer 0.25 // 1
I/Flutter ( 3457): Total:0.25
I/Flutter ( 3457): Adding to beer 0.25 // 1
I/Flutter ( 3457): Total:0.5
I/Flutter ( 3457): Adding to beer 0.33 // 1
I/Flutter ( 3457): Total:0.33
I/Flutter ( 3457): Adding to beer 0.33 // 1
I/Flutter ( 3457): Total:0.66
I/Flutter ( 3457): Adding to beer 0.5 // 1
I/Flutter ( 3457): Total:0.5
I/Flutter ( 3457): Adding to beer 0.5 // 1
I/Flutter ( 3457): Total:1.0
I/Flutter ( 3457): Adding to beer 1.0 // 1
I/Flutter ( 3457): Total:1.0
I/Flutter ( 3457): Adding to beer 1.0 // 1
I/Flutter ( 3457): Total:2.0

这是如何将其传递给我的UI就绪的BeerTitle小部件的问题(问题在父小部件中,该小部件必须显示受所有子级影响的静态变量的更改,而不是在此子级中):

BeerTile(
  key: UniqueKey(),beer: beer025,BeerTile(
  key: UniqueKey(),beer: beer033,beer: beer050,beer: beer100,

否,删除UniqueKey(无效)。如果您需要更多详细信息,请告诉我。

totalAmount is the number at the bottom and I want change it by adding beers with the lateral buttons

解决方法

您正在处理两个不同的问题:1)更新状态以更新屏幕值,以及2)更新变量。

这里Beer beer025 = new Beer(0.25,1,"025",totalAmount);的问题是您要以value的形式传递totalAmount,而您应该以{{1​​}}的形式传递。解决该问题的一种简单方法是将其更改为Map:

reference

对于第二个更新屏幕值的问题,您需要调用该函数,该函数将从UI的setState内部或使用诸如Provider之类的状态管理器来更新金额的值:
{ {3}}