Flutter/Dart:StatefulWidget-访问Widget内的类变量

我为 StatefulWidget 声明了一个类变量 - 在下面的代码中它是someString. 是否可以在build(…)-method 中使用此变量而不将其声明为静态?

class MyClass extends StatefulWidget {
  String someString;
  MyClass() {
    this.someString = "foo";
  }
  @override
  _MyClassState createState() => _MyClassState();
}

class _MyClassState extends State<MyClass> {
  _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<MyClass> {
  @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<MyClass> {
  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')`

以上是Flutter/Dart:StatefulWidget-访问Widget内的类变量的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>