为什么 StatefulWidget 的 state class 在 flutter 中应该是私有的
why state class of StatefulWidget should be private in flutter
据我所知,Flutter 中的 StatefulWidget 小部件的状态定义为私有,并且 VS Code 和 android studio 的代码片段都像下面那样在 _RectAnsState
上执行此操作
class RectAns extends StatefulWidget {
final String title;
const RectAns(this.title, {Key key}) : super(key: key);
@override
_RectAnsState createState() => _RectAnsState();
}
class _RectAnsState extends State<RectAns> {
Color _color = Colors.transparent;
@override
Widget build(BuildContext context) {
return Container()}
}
虽然我将 GlobalKey 传递给小部件,因此我可以使用此键获取 currentState 对象,但我需要从其他文件定义该 currentState 对象类型,但它的类型是私有的 class 那么它必须是 public 在这里,我的实现有什么问题
GlobalKey gk = new GlobalKey();
RectAns rectAns = new RectAns(count.toString(), key: gk);
在其他文件上,我想获得此状态以调用内部函数和 setState
RectAnsState rt = gk.currentState
上面的 RectAnsState 是 private ,所以正确的方法是 public?????
您可以删除 underline _
使其成为 public
您可以从
class _RectAnsState extends State<RectAns> {
到
class RectAnsState extends State<RectAns> {
State
class 应该是私有的,表示它不应该在 createState 覆盖之外的任何地方创建,因为你根本不应该 create/manage State
对象实例(见 and here).
在您的情况下,您不需要 create/manage State
对象,而只需要通过键访问已创建的对象。 Flutter 官方小部件中存在相同的机制,例如 Form。你有验证函数 bool validate()
存储在表单的 State
class 中,所以要访问它你需要一个 FormState
的实例。您可以像这样从全局密钥中获取它:
GlobalKey gk = GlobalKey(); // Notice that it's untyped!
GlobalKey typedGK = GlobalKey<FormState>(); // FormState has to be public
void myCallback() {
// untyped, so code fails as it doesn't know validate() exists :(
gk.currentState.validate();
// typed, so everything is fine
typedGK.currentState.validate();
}
Widget build(...) {
return Form(
key: gk,
...
);
}
所以Flutter官方的widgets如果需要类型化访问State
对象,通过key获取这个对象,就会使用这种机制。因此,在我们自己的小部件中重复这种模式应该是完全没问题的。
除此之外,我想不出一个“好的”理由让您的 State
class public 最好保密。
据我所知,Flutter 中的 StatefulWidget 小部件的状态定义为私有,并且 VS Code 和 android studio 的代码片段都像下面那样在 _RectAnsState
上执行此操作class RectAns extends StatefulWidget {
final String title;
const RectAns(this.title, {Key key}) : super(key: key);
@override
_RectAnsState createState() => _RectAnsState();
}
class _RectAnsState extends State<RectAns> {
Color _color = Colors.transparent;
@override
Widget build(BuildContext context) {
return Container()}
}
虽然我将 GlobalKey 传递给小部件,因此我可以使用此键获取 currentState 对象,但我需要从其他文件定义该 currentState 对象类型,但它的类型是私有的 class 那么它必须是 public 在这里,我的实现有什么问题
GlobalKey gk = new GlobalKey();
RectAns rectAns = new RectAns(count.toString(), key: gk);
在其他文件上,我想获得此状态以调用内部函数和 setState
RectAnsState rt = gk.currentState
上面的 RectAnsState 是 private ,所以正确的方法是 public?????
您可以删除 underline _
使其成为 public
您可以从
class _RectAnsState extends State<RectAns> {
到
class RectAnsState extends State<RectAns> {
State
class 应该是私有的,表示它不应该在 createState 覆盖之外的任何地方创建,因为你根本不应该 create/manage State
对象实例(见
在您的情况下,您不需要 create/manage State
对象,而只需要通过键访问已创建的对象。 Flutter 官方小部件中存在相同的机制,例如 Form。你有验证函数 bool validate()
存储在表单的 State
class 中,所以要访问它你需要一个 FormState
的实例。您可以像这样从全局密钥中获取它:
GlobalKey gk = GlobalKey(); // Notice that it's untyped!
GlobalKey typedGK = GlobalKey<FormState>(); // FormState has to be public
void myCallback() {
// untyped, so code fails as it doesn't know validate() exists :(
gk.currentState.validate();
// typed, so everything is fine
typedGK.currentState.validate();
}
Widget build(...) {
return Form(
key: gk,
...
);
}
所以Flutter官方的widgets如果需要类型化访问State
对象,通过key获取这个对象,就会使用这种机制。因此,在我们自己的小部件中重复这种模式应该是完全没问题的。
除此之外,我想不出一个“好的”理由让您的 State
class public 最好保密。