这个类被标记为“@immutable”,但它的一个或多个实例字段不是最终的:

Posted

技术标签:

【中文标题】这个类被标记为“@immutable”,但它的一个或多个实例字段不是最终的:【英文标题】:This class is marked as '@immutable', but one or more of its instance fields are not final: 【发布时间】:2020-01-15 15:12:05 【问题描述】:

如果我将变量声明为 final,那么我想要更改(按下时)的值(变量)在 setState() 中,因此可以更改这些变量如何防止这种情况发生?

还有,为什么写成widget.value

我尝试过使用 static 而不是 final 不起作用

class BottomCard extends StatefulWidget 

String title;

int value;
@override
_BottomCardState createState() => _BottomCardState(); 

class _BottomCardState extends State<BottomCard> ..... 


....<Widget>[  
        FloatingActionButton(
          elevation: 0,
          child: Icon(FontAwesomeIcons.plus),
          onPressed: () 
            setState(() 
              widget.value++;
            );
          ,
          backgroundColor: Color(0xFF47535E),
        ),

【问题讨论】:

【参考方案1】:

如果您不需要从外部类获取变量(标题和值)。您可以在_BottomCardState 类中声明它们并根据需要使用它们。 喜欢这段代码。

class BottomCardState extends StatefulWidget 
  @override
  _BottomCardStateState createState() => _BottomCardStateState();


class _BottomCardStateState extends State<BottomCardState> 
  int _value;
  String title;

  @override
  void initState() 
    super.initState();
    _value = 0;
    title = "any thing";
  

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      floatingActionButton: FloatingActionButton(
        elevation: 0,
        child: Icon(FontAwesomeIcons.plus),
        onPressed: () 
          setState(() 
            _value++; // increment value here
          );
        ,
      ),
    );
  


如果您需要从其他类中获取变量(值和标题)。那么您需要 1-将它们标记为 final 。 2-从构造函数中获取它们 要在_BottomCardStateState 中访问它们的值,您需要使用widget._value 访问它们。它们是最终的,您无法修改它们。 喜欢这里的代码

class App extends StatelessWidget 
  const App(Key key) : super(key: key);

  @override
  Widget build(BuildContext context) 
    return Container(
      child: BottomCardState(2,"some thing"),
    );
  


class BottomCardState extends StatefulWidget 
  final int _value;
  final String title;
  BottomCardState(this._value,this.title)

  @override
  _BottomCardStateState createState() => _BottomCardStateState();


class _BottomCardStateState extends State<BottomCardState> 
  int value ;
  @override
  Widget build(BuildContext context) 
    value = widget._value ;
    return Scaffold(
      floatingActionButton: FloatingActionButton(
        elevation: 0,
        child: Icon(FontAwesomeIcons.plus),
        onPressed: () 
          setState(() 
          value++; // increment value here
          );
        ,
      ),
    );
  

【讨论】:

@chaitanyaHarde,不客气 :)。如果它解决了您的问题,您可以将其标记为已解决。【参考方案2】:

如果我将变量声明为最终变量,那么我想要更改(按下时)的值(变量)处于设置状态(),因此可以更改这些变量如何防止这种情况发生?

扩展StatefulWidget

还有为什么要写widget.value?

这意味着您正在您的StatefulWidget 子类中访问value,并且该值实际上是在您的State 类中定义的。


完整代码应如下所示:

class BottomCardState extends StatefulWidget 
  @override
  _BottomCardStateState createState() => _BottomCardStateState();


class _BottomCardStateState extends State<BottomCardState> 
  int _value = 0; // set value here

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      floatingActionButton: FloatingActionButton(
        elevation: 0,
        child: Icon(FontAwesomeIcons.plus),
        onPressed: () 
          setState(() 
            _value++; // increment value here
          );
        ,
      ),
    );
  

【讨论】:

以上是关于这个类被标记为“@immutable”,但它的一个或多个实例字段不是最终的:的主要内容,如果未能解决你的问题,请参考以下文章

如果实现类被标记为私有,则不调用委托方法?

警告:失败的道具类型:道具`children`在`Query`中被标记为必需,但它的值是`undefined`

属性不能被标记为@NSManaged,因为它的类型不能在 Objective-C 中表示

多线程----Immutable VS Mutable (可变与不可变)

多线程----Immutable VS Mutable (可变与不可变)

将 BLL 类标记为静态或?