微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Flutter 小部件及其状态:鸡与蛋的问题

如何解决Flutter 小部件及其状态:鸡与蛋的问题

正如您在下面的代码中看到的,createState()MyWidget 的构造函数完成后运行,因此 keyword 可用。

但是,尽管 MyWidgetState 的构造函数MyWidget 的构造函数之后运行 ,但取消注释前者中的 print() 失败。 widget 似乎还没有准备好。

如果先有鸡还是先有蛋的问题解决了:先创建widget,为什么状态不能在自己的构造函数中访问widget变量呢? widgetbuild() 内访问就好了。

import 'package:Flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: MyWidget(keyword: 'keyword'),),);
  }
}

class MyWidget extends StatefulWidget {
  final String keyword;

  MyWidget({Key key,this.keyword}) : super(key: key) {
    print('In _MyWidget(): ${keyword}');
  }

  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  _MyWidgetState() {
    // print('In _MyWidgetState(): ${widget.keyword}');
  }

  @override
  Widget build(BuildContext) {
    return Text(widget.keyword);
  }
}

解决方法

这可能会也可能不会回答您的问题,但您需要使用 initState 而不是尝试使用 _MyWidgetState 的构造函数执行任何操作。这是在小部件的有状态部分发生的第一件事,它在构建方法之前。

class MyWidget extends StatefulWidget {
  final String keyword;

  MyWidget({Key key,this.keyword}) : super(key: key) {
    print('In _MyWidget(): ${keyword}');
  }

  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {

  @override
  void initState() {
    super.initState();
    print('In _MyWidgetState(): ${widget.keyword}'); // this will print
  }

  @override
  Widget build(BuildContext context) {
    return Text(widget.keyword);
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。