Flutter 小部件及其状态:先有鸡还是先有蛋的问题

A Flutter widget and its state: a chicken-and-egg problem

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

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

如果先有鸡还是先有蛋的问题解决了:先创建widget,为什么state不能在自己的构造函数中访问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);
  }
}