children property Null safety

List<Widget> children
final

The widgets below this widget in the tree.

If this list is going to be mutated, it is usually wise to put a Key on each of the child widgets, so that the framework can match old configurations to new configurations and maintain the underlying render objects.

Also, a Widget in Flutter is immutable, so directly modifying the children such as someMultiChildRenderObjectWidget.children.add(...) or as the example code below will result in incorrect behaviors. Whenever the children list is modified, a new list object should be provided.

class SomeWidgetState extends State<SomeWidget> {
  List<Widget> _children;

  void initState() {
    _children = [];
  }

  void someHandler() {
    setState(() {
        _children.add(...);
    });
  }

  Widget build(...) {
    // Reusing `List<Widget> _children` here is problematic.
    return Row(children: _children);
  }
}

The following code corrects the problem mentioned above.

class SomeWidgetState extends State<SomeWidget> {
  List<Widget> _children;

  void initState() {
    _children = [];
  }

  void someHandler() {
    setState(() {
      // The key here allows Flutter to reuse the underlying render
      // objects even if the children list is recreated.
      _children.add(ChildWidget(key: ...));
    });
  }

  Widget build(...) {
    // Always create a new list of children as a Widget is immutable.
    return Row(children: List.of(_children));
  }
}

Implementation

final List<Widget> children;