【问题标题】:This class inherits from a class marked as @immutable, and therefore should be immutable (all instance fields must be final)此类继承自标记为@immutable 的类,因此应该是不可变的(所有实例字段必须是最终的)
【发布时间】:2025-11-23 01:50:01
【问题描述】:

遇到以下问题,但无法解决,谁能帮我解决这个问题。

这个类继承自一个标记为@immutable 的类,因此应该是不可变的(所有实例字段都必须是final)。飞镖(must_be_immutable)

谢谢。

【问题讨论】:

  • 是什么阻止您执行错误提示的操作(将 var 更改为 final)?
  • 这里的问题是什么?您了解错误消息的含义吗?你的问题是如何让你自己的类不可变?
  • 错误提示所有实例字段必须是最终的@GünterZöchbauer
  • 是的。您创建一个 StatelessWidget 并添加一个变量状态。这有点矛盾;-)

标签: visual-studio flutter


【解决方案1】:

当所有类变量都未声明为 final 时,会出现此问题。您可以将它们设为最终版本,也可以忽略此警告,您可以在类声明上方添加以下注释:

//ignore: must_be_immutable

【讨论】:

  • 在 StatelessWidget 中创建可变变量的后果是什么?只是效率下降还是更糟?
  • 但是当使用 bloc 模式时,事情不仅仅是正常的,我们有根据状态返回不同小部件的构建器。所以不可变只是一个警告。
【解决方案2】:

扩展 StatelessWidget 的类中的所有字段都应该是 final 的。

来自文档。

StatelessWidget 类。不需要可变状态的小部件。

https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html

【讨论】:

  • 我收到了同样的 StatefulWidget 警告。
【解决方案3】:

确保类中的所有实例变量都标记为 final,并且对象也标记为 final。

在课堂上

class Items {
  final String title;
  final String author;
  final String event;
  final String img;
  Items({this.title, this.author, this.event, this.img});
}

在您所在的小部件内部,

 final Items item2 = new Items(
    title: "Country",
    author: "Balaji",
    event: "4 Items",
    img: "assets/panda.png",
  );

【讨论】:

  • 这篇文章的ItemsEpisode3 的关系是什么?
【解决方案4】:

任何一个不可变类在它“final”之后添加到下一行颤振代码,这将解决你的问题,

例如:-

class Register extends statelesswidget { 
static const string idScreen = 'register'; 
final TextEditingController name  = TextEditingController();
final TextEditingController email = TextEditingController();
}

【讨论】:

    【解决方案5】:
    1. flutter 中有一些编码的东西是前缀,其中之一是,无状态小部件是不可变的,所以我们在根类中使用 Final 关键字定义了所有变量。如果我们将所有变量都定义为 Final 那么这个错误将从给定的类中移除。

    2. 要消除错误,我们必须将所有变量定义为 Final,例如 final String abc = 'hello';。想了解更多关于这个错误的解决方法可以阅读Flutter官方文档here

    finalconst@immutable

    如果我们将这些属性设为final

    class Product {
      final String id;
      final String name;
      final Color color;
    
      const Product({
        this.id,
        this.name,
        this.color,
      }) ;
    }
    

    正如预期的那样,添加final 意味着我们不能再像以前那样为idname 和颜色赋值。

    我们还可以在此处添加 const 关键字,因为构造函数正在使用我们的 final 字段初始化 Product 类,使其成为编译时常量。

    我们还可以将@immutable 注解添加到我们的类中,如果任何字段不是最终的,则会显示错误:

    @immutable
    class Product {
      String id;
      final String name;
      final Color color;
    
      Product({
        this.id,
        this.name,
        this.color,
      });
    }
    

    【讨论】:

      【解决方案6】:

      来自颤振文档:

      以下是名为 GreenFrog 的无状态小部件子类的骨架。 通常,小部件有更多的构造函数参数,每个参数对应一个最终属性。

      就这样

      class IconContainer extends StatelessWidget {
      final double size;
      final Color color;
      final IconData icon;
      IconContainer(this.icon, {this.color=Colors.white, this.size=32});
      Widget build(BuildContext context) {
       //TODO...
      }
      

      【讨论】:

        【解决方案7】:

        那样使用

           class Frog extends StatelessWidget {
              const Frog({
              Key key,
              this.color = const Color(0xFF2DBD3A),
              this.child,
           }) : super(key: key);
        
          final Color color;
          final Widget child;
        
          @override
          Widget build(BuildContext context) {
            return Container(color: color, child: child);
          }
        }
        

        【讨论】:

        • 如果我需要将变量设为final,我该如何修改它?广告示例我有一个 int 变量,我需要增加或减少,如果它是最终的,我不能这样做。
        • @Kobazzo 然后你需要另一个变量。并将最终值初始化为新变量。示例-您从其他屏幕获得 int 值作为 final ( final int f)。获取一个新变量 int n;创建一个 initstate() 方法并使用 setstate() 将最终值 f 初始化为 n
        • @Abir Ahsan 但这会引发 ext.flutter.inspector.getRootWidgetSummaryTree 错误??
        【解决方案8】:

        只需在警告顶部添加这一行:

        //ignore: must_be_immutable
        

        【讨论】:

        • 这不是解决方案。
        最近更新 更多