在 Flutter 中修改来自 children 个小部件的静态变量

Modifying static variable from children widgets in Flutter

有没有办法与所有 children 共享变量?并从那里修改它?

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

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

每个 object 都应该添加到 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,
    ),
  ),
),

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

无论如何,当我进入我的模型时,我有一个方法可以更新 object 本身的数量,它应该也更新 totalAmount 的值,但它没有,而是 parently 它为每个 object 创建一个 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

以下是如何将它传递给我的 BeerTitle 小部件,其中 UI 已准备就绪(问题出在 parent 小部件中,该小部件必须显示受所有children,不在这一个):

BeerTile(
  key: UniqueKey(),
  beer: beer025,
),
BeerTile(
  key: UniqueKey(),
  beer: beer033,
),
BeerTile(
  key: UniqueKey(),
  beer: beer050,
),
BeerTile(
  key: UniqueKey(),
  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, 0, 1, "025", totalAmount); 是您将 totalAmount 作为 value 传递,而您应该传递 reference。解决问题的一个简单方法是将其更改为 Map:

Map<String, int> totalAmount = {'value': 0};

// inside your beer instance do:
totalAmount['value'] += amountToAdd;

对于更新屏幕值的第二个问题,您需要调用函数,该函数将从 UI 中的 setState 内部或使用某种状态管理器(如 Provider)更新金额值:
https://flutter.dev/docs/development/data-and-backend/state-mgmt/simple