【问题标题】:Modifying static variable from children widgets in Flutter在 Flutter 中从子小部件修改静态变量
【发布时间】:2020-12-14 06:25:00
【问题描述】:

有没有办法与所有孩子共享一个变量?并从那里修改它?

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

  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); 

每个对象都应该将我的构造函数的第一个参数中的数量添加到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

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

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

【问题讨论】:

  • pub.dev寻找提供者或getX库
  • 不,它不是,而且有充分的理由。也许您可以用简单的英语描述您想要通过您的应用实现的目标,我们可以建议一种替代方法。

标签: android ios flutter dart widget


【解决方案1】:

您正在处理两个不同的问题: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)更新金额值的函数:
@987654321 @

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多