为什么 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 最好保密。