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);
  }
}