Flutter常用的滚动组建及其优化

简介: Flutter 常用的滚动组件包括:1. ListView:在一个可滚动的列表中显示一系列的子控件。2. GridView:在一个网格布局中显示一系列的子控件。3. SingleChildScrollView:在一个可滚动的视图中显示单个子控件。4. CustomScrollView:自定义滚动模型的可滚动视图,可以同时包含多种滚动模型,如 ListView、GridView 和 SliverAppBar 等。

Flutter 常用的滚动组件包括:

  1. ListView:在一个可滚动的列表中显示一系列的子控件。
  2. GridView:在一个网格布局中显示一系列的子控件。
  3. SingleChildScrollView:在一个可滚动的视图中显示单个子控件。
  4. CustomScrollView:自定义滚动模型的可滚动视图,可以同时包含多种滚动模型,如 ListView、GridView 和 SliverAppBar 等。

ListView

ListView 是最常用的可滚动列表组件之一。使用 ListView 可以轻松地在一个可滚动的列表中显示一系列的子控件。

ListView(
  children: <Widget>[
    ListTile(
      leading: Icon(Icons.map),
      title: Text('Map'),
    ),
    ListTile(
      leading: Icon(Icons.photo_album),
      title: Text('Album'),
    ),
    ListTile(
      leading: Icon(Icons.phone),
      title: Text('Phone'),
    ),
  ],
);

当需要显示大量数据时,可以使用 ListView.builder 来避免同时创建所有子控件的问题,这样只会在屏幕上显示当前可见区域内的子控件。

ListView.builder(
  itemCount: items.length,
  itemBuilder: (context, index) {
    return ListTile(
      title: Text('Item ${items[index]}'),
    );
  },
);

GridView

GridView 是另一种常用的可滚动列表组件,它将子控件排列成网格布局。

GridView(
  gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
    crossAxisCount: 2,
    mainAxisSpacing: 10.0,
    crossAxisSpacing: 10.0,
    childAspectRatio: 1.0,
  ),
  children: <Widget>[
    Container(color: Colors.red),
    Container(color: Colors.green),
    Container(color: Colors.blue),
    Container(color: Colors.yellow),
  ],
);

与 ListView 一样,当需要显示大量数据时,可以使用 GridView.builder 来避免同时创建所有子控件的问题。

GridView.builder(
  gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
    crossAxisCount: 2,
    mainAxisSpacing: 10.0,
    crossAxisSpacing: 10.0,
    childAspectRatio: 1.0,
  ),
  itemCount: items.length,
  itemBuilder: (context, index) {
    return Container(color: items[index]);
  },
);

SingleChildScrollView

SingleChildScrollView 是一个可滚动的视图,它只能包含单个子控件。

SingleChildScrollView(
  child: Column(
    children: <Widget>[
      Container(height: 100, color: Colors.red),
      Container(height: 100, color: Colors.green),
      Container(height: 100, color: Colors.blue),
      Container(height: 100, color: Colors.yellow),
    ],
  ),
);

与 ListView 不同,SingleChildScrollView 不会自动回收不可见区域的子控件。因此,应该尽可能减少子控件的数量,并将其放到层次结构较浅的位置。

CustomScrollView

CustomScrollView 是自定义滚动模型的可滚动视图,可以同时包含多种滚动模型,如 ListView、GridView 和 SliverAppBar 等。

CustomScrollView(
  slivers: <Widget>[
    SliverAppBar(
      title: Text('Title'),
      expandedHeight: 200,
      flexibleSpace: FlexibleSpaceBar(
        background: Image.network(
          'https://picsum.photos/200/300',
          fit: BoxFit.cover,
        ),
      ),
    ),
    SliverFixedExtentList(
      itemExtent: 50,
      delegate: SliverChildBuilderDelegate(
        (context, index) {
          return ListTile(title: Text('Item $index'));
        },
        childCount: 20,
      ),
    ),
  ],
);

优化

使用更轻量级的滚动组件

SingleChildScrollView 比 ListView 更轻松,因为它只有一个子控件。如果列表较短,可以考虑使用 SingleChildScrollView。

使用 ListView.builder 或 GridView.builder

当需要显示大量数据时,使用 ListView.builder 或 GridView.builder 可以避免同时创建所有子控件的问题,仅在屏幕上显示当前可见区域内的子控件。

优化子控件的构建过程

对于静态的子控件,可以使用 const 构造函数创建。对于动态的子控件,可以将部分子控件放到 Stateful 组件中管理,或使用 StatefulBuilder 在需要更新的子树中包装子控件。

ListView.builder(
  itemCount: items.length,
  itemBuilder: (context, index) {
    return StatefulBuilder(
      builder: (context, setState) {
        return ListTile(
          title: Text('Item ${items[index]}'),
          trailing: IconButton(
            icon: Icon(Icons.favorite),
            color: isFavorite(index) ? Colors.red : null,
            onPressed: () {
              setState(() {
                setFavorite(index, !isFavorite(index));
              });
            },
          ),
        );
      },
    );
  },
);

避免在滚动时频繁进行重绘

使用 AutomaticKeepAliveClientMixin 可以避免不必要的重绘,将需要保持状态的子控件放到 Stateful 组件中,并在组件中实现 wantKeepAlive 和 build 方法即可。

class MyListItem extends StatefulWidget {
  final int index;
  const MyListItem({Key? key, required this.index}) : super(key: key);
  @override
  _MyListItemState createState() => _MyListItemState();
}
class _MyListItemState extends State<MyListItem>
    with AutomaticKeepAliveClientMixin {
  bool _isFavorite = false;
  @override
  bool get wantKeepAlive => true;
  @override
  Widget build(BuildContext context) {
    super.build(context);
    return ListTile(
      title: Text('Item ${widget.index}'),
      trailing: IconButton(
        icon: Icon(Icons.favorite),
        color: _isFavorite ? Colors.red : null,
        onPressed: () {
          setState(() {
            _isFavorite = !_isFavorite;
          });
        },
      ),
    );
  }
}

合理使用 ScrollController 和 NotificationListener

使用 ScrollController 可以监听滚动事件,及时释放资源和加载数据。使用 NotificationListener 可以监听滚动事件并执行自定义操作。

class MyListView extends StatefulWidget {
  @override
  _MyListViewState createState() => _MyListViewState();
}
class _MyListViewState extends State<MyListView> {
  final _controller = ScrollController();
  bool get _isScrolledToBottom {
    return _controller.offset >= _controller.position.maxScrollExtent &&
        !_controller.position.outOfRange;
  }
  @override
  Widget build(BuildContext context) {
    return NotificationListener<ScrollNotification>(
      onNotification: (notification) {
        if (notification is ScrollEndNotification && _isScrolledToBottom) {
          loadMoreData();
        }
        return false;
      },
      child: ListView.builder(
        controller: _controller,
        itemCount: items.length,
        itemBuilder: (context, index) {
          return MyListItem(index: index);
        },
      ),
    );
  }
}
相关文章
|
6月前
|
缓存 监控 前端开发
【Flutter 前端技术开发专栏】Flutter 应用的启动优化策略
【4月更文挑战第30天】本文探讨了Flutter应用启动优化策略,包括理解启动过程、资源加载优化、减少初始化工作、界面布局简化、异步初始化、预加载关键数据、性能监控分析以及案例和未来优化方向。通过这些方法,可以缩短启动时间,提升用户体验。使用Flutter DevTools等工具可助于识别和解决性能瓶颈,实现持续优化。
269 0
【Flutter 前端技术开发专栏】Flutter 应用的启动优化策略
|
6月前
|
数据库 容器
Flutter笔记:滚动之-无限滚动与动态加载的实现
Flutter笔记:滚动之-无限滚动与动态加载的实现
280 0
|
6月前
|
JSON Dart 安全
Flutter App混淆加固、保护与优化原理
Flutter App混淆加固、保护与优化原理
116 0
|
13天前
|
UED 开发者 容器
Flutter&鸿蒙next 的 Sliver 实现自定义滚动效果
Flutter 提供了强大的滚动组件,如 ListView 和 GridView,但当需要更复杂的滚动效果时,Sliver 组件是一个强大的工具。本文介绍了如何使用 Sliver 实现自定义滚动效果,包括 SliverAppBar、SliverList 等常用组件的使用方法,以及通过 CustomScrollView 组合多个 Sliver 组件实现复杂布局的示例。通过具体代码示例,展示了如何实现带有可伸缩 AppBar 和可滚动列表的页面。
74 1
|
4月前
|
UED
Flutter-无限循环滚动标签
Flutter-无限循环滚动标签
78 0
|
4月前
|
机器人 开发工具 Android开发
flutter web 优化和flutter_admin_template
flutter web 优化和flutter_admin_template
|
4月前
Flutter 滚动距离来设置TabBar的位置,点击TabBar滚动的到指定的位置
Flutter 滚动距离来设置TabBar的位置,点击TabBar滚动的到指定的位置
|
6月前
|
前端开发 UED 开发者
【Flutter前端技术开发专栏】Flutter中的列表与滚动视图优化
【4月更文挑战第30天】Flutter开发中,优化列表和滚动视图至关重要。本文介绍了几种优化方法:1) 使用`ListView.builder`和`GridView.builder`实现懒加载;2) 复用子组件以减少实例创建;3) 利用`CustomScrollView`和`Slivers`提升滚动性能;4) 通过`NotificationListener`监听滚动事件;5) 使用`KeepAlive`保持列表项状态。掌握这些技巧能提升应用性能和用户体验。
102 1
【Flutter前端技术开发专栏】Flutter中的列表与滚动视图优化
|
6月前
|
存储 缓存 监控
【Flutter前端技术开发专栏】Flutter中的列表滚动性能优化
【4月更文挑战第30天】本文探讨了Flutter中优化列表滚动性能的策略。建议使用`ListView.builder`以节省内存,避免一次性渲染所有列表项。为防止列表项重建,可使用`UniqueKey`或`ObjectKey`。缓存已渲染项、减少不必要的重绘和异步加载大数据集也是关键。此外,选择轻量级组件,如`StatelessWidget`,并利用Flutter DevTools监控性能以识别和解决瓶颈。持续测试和调整以提升用户体验。
203 0
【Flutter前端技术开发专栏】Flutter中的列表滚动性能优化
|
6月前
|
存储 缓存 前端开发
【Flutter前端技术开发专栏】Flutter中的图片加载与缓存优化
【4月更文挑战第30天】本文探讨了 Flutter 中如何优化图片加载与缓存,以提升移动应用性能。通过使用图片占位符、压缩裁剪、缓存策略(如`cached_network_image`插件)以及异步加载和预加载图片,可以显著加快加载速度。此外,利用`FadeInImage`、`FutureBuilder`和图片库等工具,能进一步改善用户体验。优化图片处理是提升Flutter应用效率的关键,本文为开发者提供了实用指导。
595 0
【Flutter前端技术开发专栏】Flutter中的图片加载与缓存优化