Flutter:如何为 StatefulWidget 创建非最终属性?

Pig*_*gna 5 attributes state final dart flutter

假设我想创建一个按钮,每次点击它都会改变颜色。在构造函数中需要它的起始颜色。

以下代码工作正常,但是当我将鼠标悬停在 TestButton 顶部时,我收到以下消息:“此类(或此类继承自的类)被标记为‘@immutable’,但它的一个或多个实例字段不是最终:TestButton.color”。

如果它应该是最终的但我需要改变它,那么解决方案是什么?如果它仍然有效,为什么它是最终的?

class TestButton extends StatefulWidget {
  TestButton({this.color});
  Color color;
  @override
  _TestButtonState createState() => _TestButtonState();
}

class _TestButtonState extends State<TestButton> {
  @override
  Widget build(BuildContext context) {
    return RaisedButton(
      onPressed: () {
        setState(() {
          widget.color = widget.color == Colors.red ? Colors.blue : Colors.red;
        });
      },
      child: Icon(
        Icons.add,
        size: 80,
      ),
      color: widget.color,
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

Aym*_*out 6

您可以在 的State对象中拥有变量StatefulWidget,而不是在其StatefulWidget本身中。

如果您需要从另一个小部件传递值,您可以传递它并将其重新分配给函数中的一个State变量initState

例子:

class TestButton extends StatefulWidget {
  TestButton({this.passedcolor});
  final Color passedColor;
  @override
  _TestButtonState createState() => _TestButtonState();
}

class _TestButtonState extends State<TestButton> {
  Color color;

  @override
  initState(){
   color = widget.passedColor;
   super.initState()
  }

  @override
  Widget build(BuildContext context) {
    return RaisedButton(
      onPressed: () {
        setState(() {
          color = color == Colors.red ? Colors.blue : Colors.red;
        });
      },
      child: Icon(
        Icons.add,
        size: 80,
      ),
      color: color,
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用setState任何你想要的颜色来更新它。

至于为什么在构造函数中传递的值必须是final或者为什么你不能改变它是因为它StatefulWidget本身是不可变的并持有不可变的数据,但它也持有一个可变State对象,它是aka mutable data小部件所需的所有状态的存储。

引用 Flutter 文档:

StatefulWidget 实例本身是不可变的,并且将它们的可变状态存储在由 createState 方法创建的单独 State 对象中,或者存储在 State 订阅的对象中,例如 Stream 或 ChangeNotifier 对象,这些对象的引用存储在 StatefulWidget 的最终字段中本身。

您可以在此处阅读更多相关信息: Flutter 网站上的 StatefulWidget 类文档