用Nested来处理Flutter嵌套过深的问题。

295 阅读1分钟

背景

在使用Provider的时候,可以用MultiProvider来注册。

动机

小部件往往会很快嵌套。不难看到:

MyWidget(
  child: AnotherWidget(
    child: Again(
      child: AndAgain(
        child: Leaf(),
      )
    )
  )
)

那不是很理想。

那里有nested提出解决方案的地方。使用nested,可以将之前的树展平为:

Nested(
  children: [
    MyWidget(),
    AnotherWidget(),
    Again(),
    AndAgain(),
  ],
  child: Leaf(),
),

这更具可读性!

用法

Nested依赖于一种新的widget:SingleChildWidget,它有两个具体实现:

这些是原始的SingleChildWidget变体。Stateless StatefulWidget

小部件和它的单子变体之间的区别在于它们有一个build采用额外参数的自定义方法。

因此,StatelessWidget将是:

class MyWidget extends StatelessWidget {
  MyWidget({Key key, this.child}): super(key: key);

  final Widget child;

  @override
  Widget build(BuildContext context) {
    return SomethingWidget(child: child);
  }
}

SingleChildStatelessWidget将是:

class MyWidget extends SingleChildStatelessWidget {
  MyWidget({Key key, Widget child}): super(key: key, child: child);

  @override
  Widget buildWithChild(BuildContext context, Widget child) {
    return SomethingWidget(child: child);
  }
}

这允许我们的MyWidget用于:

MyWidget(
  child: AnotherWidget(),
)

并像这样放置在[Nested]的children 中:

Nested(
  children: [
    MyWidget(),
    ...
  ],
  child: AnotherWidget(),
)