flutter中的builder

简介

flutter中有很多种Builder,虽然所有的builder都是构造器,但是不同的builder之间还是有很多差距的。今天我们来详细介绍一下Builder,LayoutBuilder,StatefulBuilder这几个builder的使用。

Builder

Builder是flutter中最常用的builder,它是一个StatelessWidget,如下所示:

class Builder extends StatelessWidget

我们看下它的构造函数:

  const Builder({
    Key? key,
    required this.builder,
  }) : assert(builder != null),
       super(key: key);

可以看到Builder和普通的StatelessWidget的最大的差别就是需要传入一个builder属性,这个builder是一个WidgetBuilder类型的属性,

WidgetBuilder是这样定义的:

typedef WidgetBuilder = Widget Function(BuildContext context);

可以看到WidgetBuilder实际上是一个返回Widget的函数,这个函数在Builder被包含在parent’s build方法中的时候,会被调用。

那么使用Builder和普通的StatelessWidget有什么区别呢?

我们举个例子,首先是在Scaffold中直接包含一个包括TextButton的Center widget,如下所示:

Widget build(BuildContext context) {
  return Scaffold(
    body: Center(
      child: TextButton(
        child: Text('TextButton'),
      )
    ),
  );
}

上面的Center也可以使用Builder来封装:

Widget build(BuildContext context) {
  return Scaffold(
    body: Builder(
      builder: (BuildContext context) {
        return Center(
          child: TextButton(
            child: Text('TextButton'),
          ),
        );
      },
    ),
  );
}

初看起来两者没有太大的区别,但是不同的是在下面的例子中,我们使用了Builder来构建body。

Builder的builder方法中我们传入了一个context,这个context是当前builder的context,我们可以通过这个context来获取到一些平时比较难获取到的对象。

对于Scaffold来说,它提供了一个of方法,可以根据传入的context来找到离context最近的Scaffold。这也是我们使用builder的目的:

Widget build(BuildContext context) {
  return Scaffold(
    body: Builder(
      builder: (BuildContext context) {
        return Center(
          child: TextButton(
            onPressed: () {
              print(Scaffold.of(context).hasAppBar);
            },
            child: Text('TextButton'),
          ),
        );
      },
    ),
  );
}

如上,我们可以在builder中,调用Scaffold.of(context)方法来获取对应的Scaffold对象。

如果只是使用普通的StatelessWidget的话,是没法拿到Scaffold对象的。

StatefulBuilder

上一节我们提到的Buidler实际上是一个StatelessWidget,表明builder是无状态的。

而StatefulBuilder则和Builder不同,它是有状态的:

class StatefulBuilder extends StatefulWidget

可以看到StatefulBuilder继承自StatefulWidget。

和Builder很类似,StatefulBuilder也有一个builder属性,不过这个builder属性的类型是StatefulWidgetBuilder:

typedef StatefulWidgetBuilder = Widget Function(BuildContext context, StateSetter setState);

可以看到StatefulWidgetBuilder被调用的时候,不仅传入了BuildContext,还同时调用了setState方法。

StateSetter方法会导致Widget重构。

如果我们创建的widget是一个StatefulWidget的话,那么就可以尝试使用StatefulBuilder来代替:

 Widget build(BuildContext context) {
    return Center(
      child: Builder(
        builder: (BuildContext context) {
          int clicked = 0;
          return Center(
            child: StatefulBuilder(
              builder: (BuildContext context, StateSetter setState) {
                    return TextButton(onPressed: (){
                      setState(() => {clicked = 1 });
                    },
                        child: Text('TextButton'));
                  }),
                );
        },
      ),
    );
  }

LayoutBuilder

Builder可以传递BuildContext, StatefulBuilder可以传递StateSetter,LayoutBuilder和上面提到的两个Builder很类似,不同的是LayoutBuilder可以提供父widget的大小。

我们先来看下LayoutBuilder的定义:

class LayoutBuilder extends ConstrainedLayoutBuilder<BoxConstraints> 

可以看到LayoutBuilder继承的类是不同的。

LayoutBuilder需要传入一个builder属性,这个builder是一个LayoutWidgetBuilder对象:

typedef LayoutWidgetBuilder = Widget Function(BuildContext context, BoxConstraints constraints);

具体的使用方法和Builder很类似,不同的是我们可以根据传入的BoxConstraints来进行对应的逻辑判断。

看一个具体的例子:

class LayoutBuilderApp extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return LayoutBuilder(
      builder: (BuildContext context, BoxConstraints constraints) {
        if (constraints.maxWidth > 500) {
          return buildWidget1();
        } else {
          return buildWidget2();
        }
      },
    );
  }

  Widget buildWidget1() {
    return Center(
      child: Container(
        height: 700.0,
        width: 700.0,
        color: Colors.blue,
      ),
    );
  }

  Widget buildWidget2() {
    return Center(
      child: Container(
        height: 200.0,
        width: 200.0,
        color: Colors.yellow,
      ),
    );
  }

上面的例子中,我们根据BoxConstraints的大小,来返回不同的Widget组件。

这在某些情况下是非常有用的。

总结

本文介绍了三个常用的Builder,大家可以仔细体会。

本文的例子:https://github.com/ddean2009/learn-flutter.git

### 回答1: 好的,以下是Flutter ListView.builder的相关内容: Flutter的ListView.builder是一种创建可滚动列表的方式。 它是使用基于生成器的方式来创建项目的,这意味着仅当需要显示项目时才会生成它们,这可以显著提高性能。 以下是ListView.builder的基本用法: ```dart ListView.builder( itemCount: items.length, itemBuilder: (BuildContext context, int index) { return ListTile( title: Text(items[index]), ); }, ); ``` 其,`itemCount`属性指定了列表的项数,而`itemBuilder`属性是一个回调函数,用于生成每个项目的小部件。 在这个例子,我们使用了`ListTile`小部件来呈现列表项。`ListTile`是一种内置的小部件,用于创建带有文本和可选图标的项目。 你可以将这些代码放到Flutter应用程序的任何位置,以创建一个基本的ListView.builder。 ### 回答2: Flutter Listview.BuilderFlutter框架的一种基于ListView的快速构建方法。ListView是Flutter的一个常见UI组件,用于在Flutter应用呈现多个数据垂直或水平列表。ListView.Builder是ListView的一种实现方式,它可以更加灵活地适应不同的应用场景。 使用Flutter Listview.Builder,我们可以使用一组数据来快速构建一个列表视图,而不需要手动添加多个组件。我们可以使用类似于map()函数的方式来将列表每个数据项映射到一个组件,然后将这些组件作为列表的items属性传递给ListView.Builder。 与其他构建ListView的方法相比,使用ListView.Builder的好处在于它的效率更高,因为它只会在显示屏幕所需要的数据项上构建组件,而不是在整个列表上构建所有组件。这种构建方式能够显著提高性能和渲染速度。 在实际使用ListView.Builder时,我们需要通过itemCount属性来指定列表的长度,然后在itemBuilder回调函数构建每个数据项所对应的组件。此外,我们还可以在ListView.Builder使用其他键来进行更多的自定义,例如控制滚动的控制器、构建分割线、调整列表项之间的间距等等。 总之,Flutter Listview.Builder是一个快速、灵活且高效的构建Flutter列表视图的方法,在应用使用它可以有效地提高应用渲染性能和响应速度,是一个值得使用的重要UI组件。 ### 回答3: Flutter是一个快速开发高质量、高性能并且可即时部署到iOS和Android平台的跨平台移动应用框架。ListView是Flutter最基本、最常用的列表组件之一,它可以用来显示任意类型的数据列表,而ListView.builder则是一个快速而且可以高度定制列表的方法。 ListView.builder的工作方式是接受一个itemBuilder回调函数,它可以根据数据源和索引来构建一个可视化的列表项。ListView.builder用于构建动态列表,只会在需要时才会进行渲染,通过比普通ListView更高效地创建长列表来减少资源占用。 该组件有许多属性来控制其外观、交互和动画效果。您可以设置列表项高度、内容填充等,使您的列表在各种设备和屏幕尺寸上看起来完美。除了itemBuilder,还有一些其他属性,如itemCount,用于指定列表项数量;itemExtent,用于指定每个列表项的固定高度等。 总之,ListView.builderFlutter非常重要的一个组件,它简化了Flutter的动态列表的构建和管理。 由于其高效性和易于使用的属性,它已经成为Flutter应用程序的重要部分。所以我们要熟练掌握该组件以便更有效地构建数据展示列表、列表式的交互体验等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值