Flutter 使用小部件属性与在状态类上获取参数

Flutter 使用小部件属性与在状态类上获取参数,flutter,Flutter,给定一个有状态的小部件,它在调用时接受参数,有两个选项(我知道)。 我可以使用widget.arg访问state对象中的数据,也可以在state对象中创建新变量和新构造函数 现在我主要使用了第二个,在一些用例中,第一个会导致一些问题。然而,它看起来更简洁易读(我猜) 我的问题是哪一个更好 示例代码: 第一种选择: class Home extends StatefulWidget { final String email; const Home({Key key, this.email

给定一个有状态的小部件,它在调用时接受参数,有两个选项(我知道)。 我可以使用
widget.arg
访问state对象中的数据,也可以在state对象中创建新变量和新构造函数

现在我主要使用了第二个,在一些用例中,第一个会导致一些问题。然而,它看起来更简洁易读(我猜)

我的问题是哪一个更好

示例代码:

第一种选择:

class Home extends StatefulWidget {
  final String email;

  const Home({Key key, this.email}) : super(key: key);
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  String example() {
    return widget.email;
  }
class Home扩展StatefulWidget{
最终字符串电子邮件;
const Home({Key,this.email}):super(Key:Key);
@凌驾
_HomeState createState()=>\u HomeState();
}
类(HomeState扩展状态){
字符串示例(){
返回widget.email;
}
第二种选择:

class Home extends StatefulWidget {
final String email;
  const Home({Key key, this.email}) : super(key: key);
  @override
  _HomeState createState() => _HomeState(email);
}

class _HomeState extends State<Home> {
  final String email;
  _HomeState(this.email);



  String example() {
        return email;
      }
class Home扩展StatefulWidget{
最终字符串电子邮件;
const Home({Key,this.email}):super(Key:Key);
@凌驾
_HomeState createState()=>\u HomeState(电子邮件);
}
类(HomeState扩展状态){
最终字符串电子邮件;
_HomeState(本邮件);
字符串示例(){
回复邮件;
}

我使用这两种方法,但是,我不为第二种方法使用构造函数,因为idk我不喜欢它。我在initState中存储引用。类似于
email=widget.email;

这真的要看情况。这主要是偏好。但我使用
小部件。
方法通常避免使用样板代码,这是一种识别哪些参数来自小部件,哪些参数来自状态的方法


Flatter团队也使用这种方法。很多。检查源代码。如果两次声明参数并将它们传递给_AppBarState,那将是一个混乱的过程。它更干净,对它们有效。对我来说;)

我使用这两种方法,但是,第二种方法我不使用构造函数,因为idk我不喜欢它。我在中存储引用类似于
email=widget.email;

这真的要看情况。这主要是偏好。但我使用
小部件。
方法通常避免使用样板代码,这是一种识别哪些参数来自小部件,哪些参数来自状态的方法


Flatter团队也使用这种方法。很多。检查源代码。如果两次声明参数并将它们传递给AppBarState,那将是一个混乱的过程。它更干净,而且对它们有效。对我来说;)

不要使用第二个选项,也就是在
状态下有一个构造函数。这是一种糟糕的做法。
改用
.widget.property
语法

如果有意忽略属性的更新,请使用
initState

类示例{
示例(此.initialText);
最后一个字符串initialText;
@凌驾
_ExampleState createState()=>\u ExampleState();
}
类_示例状态扩展状态{
字符串文本;
@凌驾
void initState(){
text=widget.initialText;
}
}

不要使用第二个选项,即在
状态下有构造函数。这是一种不好的做法。
改用
.widget.property
语法

如果有意忽略属性的更新,请使用
initState

类示例{
示例(此.initialText);
最后一个字符串initialText;
@凌驾
_ExampleState createState()=>\u ExampleState();
}
类_示例状态扩展状态{
字符串文本;
@凌驾
void initState(){
text=widget.initialText;
}
}

是否可以将文本定义为最终变量?
最终字符串文本;
是否可以将文本定义为最终变量?
最终字符串文本;