美文网首页
Builder、LayoutBuilder、StatefulBu

Builder、LayoutBuilder、StatefulBu

作者: 码农_小斌哥 | 来源:发表于2021-11-21 09:37 被阅读0次

    1.介绍

    • Builder:创建一个widget树
    • LayoutBuilder:构建一个可以依赖父窗口大小的widget树
    • StatefulBuilder:创建一个支持局部更新的widget树
    • SliverLayoutBuilder:创建一个支持折叠的widget树
      当然还有FutureBuilder、StreamBuilder,这些是用来异步更新UI的,这个以后介绍。

    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

    相关文章

      网友评论

          本文标题:Builder、LayoutBuilder、StatefulBu

          本文链接:https://www.haomeiwen.com/subject/acqetrtx.html