作者:宝宝717917 | 来源:互联网 | 2023-08-17 17:42
我为 StatefulWidget 声明了一个类变量 - 在下面的代码中它是someString
. 是否可以在build(…)
-method 中使用此变量而不将其声明为静态?
class MyClass extends StatefulWidget {
String someString;
MyClass() {
this.someString = "foo";
}
@override
_MyClassState createState() => _MyClassState();
}
class _MyClassState extends State {
_MyClassState();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("someString - how to access it here?!"),
// title: Text(someString), is not possible, obviously
),
);
}
}
预先感谢您的帮助!
回答
注意:MyClass
应该是不可变的。
1.如果someString
永远不会改变
将其保留在内部,MyClass
但将其定义为 final。
class MyClass extends StatefulWidget {
final String someString;
const MyClass({Key key, this.someString = 'foo'}) : super(key: key);
@override
_MyClassState createState() => _MyClassState();
}
然后,在 State 内部,您可以将其用作widget.someString
:
class _MyClassState extends State {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('${widget.someString} is accessed here?!')),
);
}
}
2.如果someString
会改变
它应该在状态中定义。
class MyClass extends StatefulWidget {
final String initialValue;
const MyClass({Key key, this.initialValue = 'foo'}) : super(key: key);
@override
_MyClassState createState() => _MyClassState();
}
class _MyClassState extends State {
String someString;
@override
void initState() {
someString = widget.initialValue;
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('$someString is accessed here?!')),
body: Center(
child: OutlinedButton(
onPressed: () => setState(() => someString = 'NEW Value'),
child: Text('Update value'),
),
),
);
}
}
`MyClass(initialValue: 'Azerty')`