在Flutter中初始化有状态小部件中的不可变字段

omvjsjqw  于 2023-02-09  发布在  Flutter
关注(0)|答案(1)|浏览(96)

在flutter中创建一个有状态的小部件时,你可能不希望小部件的某些字段发生变化。在这种情况下,我很难弄清楚是总是从状态的widget引用中引用这些字段更好,还是在状态中声明这些字段更好,然后从小部件中获取任何初始值。例如:

class MyStatefulWidget extends StatefulWidget {
    final bool? mutateMe; // allows the user to provide an initial value of a mutable field
    final bool? doNotMutateMe; // allows the user to provide the value of a field that is not intended to be mutated

    MyStatefulWidget({ super.key, this.mutateMe, this.doNotMutuateMe });

    @override State<MyStatefulWidget> createState() => MyStatefulWidgetState();
}

class MyStatefulWidgetState extends State<MyStatefulWidget> {
    late bool mutateMe;
    late bool doNotMutateMe; // <-- HERE: is it better to include this field here?

    @override void initState() {
        mutateMe = widget.mutateMe ?? true; 
        doNotMutateMe = widget.doNotMutateMe ?? false;
    }

    // ...
}

对于像doNotMutateMe这样的字段,不打算修改,在state对象中重新创建字段是否有意义,并且总是引用widget.doNotMutateMe?我读到state对象比小部件更有效,所以我很好奇这可能有什么含义?

hmtdttj4

hmtdttj41#

正如您所提到的,我更喜欢在state类上使用widget.variableName

class MyStatefulWidget extends StatefulWidget {
  final bool? mutateMe;
  final bool? doNotMutateMe;

  const MyStatefulWidget({
    super.key,
    this.mutateMe = true,
    this.doNotMutateMe = false,
  });

  @override
  State<MyStatefulWidget> createState() => MyStatefulWidgetState();
}

相关问题