Flutter中安装flutter_lints后不要在createState中放入任何逻辑

Moh*_*bil 29 dart flutter

flutter_lints在我的项目中安装了插件,安装后它显示一条警告消息“不要在 createState 中放置任何逻辑”。如何解决这个问题?

class OverviewPage extends StatefulWidget {
  final int id;
  const OverviewPage({Key? key, required this.id}) : super(key: key);

  @override
  _OverviewPageState createState() => _OverviewPageState(id); // Warning on this line
}

class _OverviewPageState extends State<OverviewPage>{
  late final int id;
  _OverviewPageState(this.id);
}
Run Code Online (Sandbox Code Playgroud)

mmc*_*n20 47

不要_OverviewPageState在构造函数中传递任何内容。

class OverviewPage extends StatefulWidget {
  final int id;
  const OverviewPage({Key? key, required this.id}) : super(key: key);

  @override
  _OverviewPageState createState() => _OverviewPageState();
}

class _OverviewPageState extends State<OverviewPage>{
  // if you need to reference id, do it by calling widget.id
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么在`_OverviewPageState()`中传递一些东西是不好的? (9认同)
  • “createState() 的实现应该返回一个 State 对象的新实例,并且不执行任何其他操作”,但是为什么呢?我想知道为什么这是首选?比如有什么好处? (7认同)
  • 但我想将默认值传递给 State - 并且“widget.”无法在构造函数中访问。除了 `//ignore: no_logic_in_create_state` 之外,是否有设置状态值默认值的解决方案? (4认同)
  • 我想知道糟糕的方法是否与记忆有关,而不是与风格有关。 (3认同)

小智 9

我有人想在主类中启动一个变量,您可以使用它,因为您不能在构造函数类中使用它。

@override
void initState() {
    super.initState();
    id = widget.id;
    code = widget.code;
    //your code here
}
Run Code Online (Sandbox Code Playgroud)


And*_*reP 8

我想合并您收到的两个答案会更好。

@mmcdon20是对的,您不必将任何参数传递给状态构造函数,因为正如@Mohamed所说,您可以使用 widget 参数或在 的构造函数中通过 init_state 来完成此操作_OverviewPageState

我只是在这里对答案进行融合,以便对于那些刚接触 Flutter 的人来说更加准确。

最终结果应如下所示:

class OverviewPage extends StatefulWidget {
  final int id;
  const OverviewPage({Key? key, required this.id}) : super(key: key);

  @override
  _OverviewPageState createState() => _OverviewPageState();
}

class _OverviewPageState extends State<OverviewPage>{
  late int idCopy; 
  // the 'late' keyword is necessary because otherwise Flutter would expect
  // an initialization of the value from a Constructor that accept 'int id' 
  // as a parameter which is what we are trying to avoid because it's not the
  // correct path to follow when you initialize a State of StatefulWidget

  @override
  void initState() {
    super.initState();
    idCopy = widget.id;
    //your code here
  }
}
Run Code Online (Sandbox Code Playgroud)

或者,使用构造函数

class _OverviewPageState extends State<OverviewPage>{
  late int idCopy; 
  
  _OverviewPageState() {
    idCopy = widget.id; // here it is :)
  }
}

Run Code Online (Sandbox Code Playgroud)

希望能解答新人的疑惑:)

致谢:@Mohamed_Hammane、@mmcdon20