Builder、LayoutBuilder、StatefulBu

2021-11-21  本文已影响0人  码农_小斌哥

1.介绍

2. Builder

这个我们之前用过,在讲BottomSheet,Dialog,SnackBar的时候都用到过。

3. LayoutBuilder

这个就是可以返回所依赖布局的约束

  _myLayoutBuilder() {
    return LayoutBuilder(
        builder: (BuildContext context, BoxConstraints constraints) {
      print('constraints = $constraints');
      return Container(
        width: 50,
        height: 50,
        color: Colors.red,
      );
    });
  }

4.StatefulBuilder

通过这个可以创建一个支持局部刷新的widget树,比如你可以在StatelessWidget里面刷新某个布局,但是不需要改变成StatefulWidget;你也可以在StatefulWidget中使用做部分刷新而不需要刷新整个页面,这个刷新是不会调用Widget build(BuildContext context)刷新整个布局树的。

  _myStatefulBuilder() {
    var _color = Colors.green;
    return StatefulBuilder(
        builder: (BuildContext context, StateSetter setState) {
      return Container(
        width: 50,
        height: 50,
        color: _color,
        child: InkWell(
          onTap: () {
            setState(() {
              ToastUtil.showToast('onTap');
              _color = _color == Colors.amber ? Colors.green : Colors.amber;
            });
          },
        ),
      );
    });
  }

image

5.SliverLayoutBuilder

创建一个支持折叠的widget树。(说到这个之前说Sliver组件后面讲给忘了,稍后补上)

  _mySliverLayoutBuilder() {
    var _color = Colors.green;
    return CustomScrollView(
      physics: BouncingScrollPhysics(),
      slivers: [
        SliverLayoutBuilder(
            builder: (BuildContext context, SliverConstraints constraints) {
          print('SliverConstraints  = $constraints');
          if (constraints.userScrollDirection == ScrollDirection.forward) {
            _color = Colors.blue;
          } else if (constraints.userScrollDirection == ScrollDirection.idle) {
            _color = Colors.green;
          } else {
            _color = Colors.cyan;
          }

          return SliverToBoxAdapter(
            child: Container(
              height: 100,
              color: _color,
            ),
          );
        }),
        SliverList(
            delegate:
                SliverChildBuilderDelegate((BuildContext context, int index) {
          return Card(
            child: Container(
              height: 50,
              color: Colors.primaries[(index % 18)],
            ),
          );
        }, childCount: 80)),
      ],
    );
  }

image image image
上一篇下一篇

猜你喜欢

热点阅读