本文主要介绍在带有背景图像的Flutter中拉动以刷新

拉动刷新”是显示动态数据列表的移动应用程序的常见任务。今天我们将使用 pull_to_refresh 包实现 pull to refresh 并利用 Slivers 创建一个自定义的 Collapsible 标头

刷新示例

设置

我们将首先将 pull_to_refresh 包添加到我们的项目中

pull_to_refresh: ^1.4.5

然后我们可以使用 aMaterialApp和一个Home小部件进行基本设置。

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(title: 'Flutter Demo', home: Home());
  }
}

class Home extends StatelessWidget {
  final RefreshController _refreshController = RefreshController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.grey[700],
      body: Container(),
    );
  }
}

然后我们将创建一个函数,该函数返回我们将用于在列表中显示的小部件列表。我们将在彼此下方显示高度为 100 的圆角矩形。

 List<Widget> buildList() {
    return List.generate(
        15,
        (index) => Container(
              height: 100,
              margin: const EdgeInsets.symmetric(
                vertical: 10,
                horizontal: 15,
              ),
              decoration: BoxDecoration(
                color: Colors.white,
                borderRadius: BorderRadius.circular(15),
              ),
            ));
  }

执行

现在我们可以继续添加 PullToRefresh 功能。我们将导入包然后创建我们的控制器作为最终变量。我们将使我们的脚手架主体成为一个 SmartRefresher 来接收我们的控制器。

import 'package:pull_to_refresh/pull_to_refresh.dart';

class Home extends StatelessWidget {
  final RefreshController _refreshController = RefreshController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.grey[700],
      body: SmartRefresher(
        controller: _refreshController,
        enablePullDown: true,
        header: defaultHeader,
        onRefresh: () async {
          await Future.delayed(Duration(seconds: 1));
          _refreshController.refreshCompleted();
        },
         child: CustomScrollView(
          slivers: [
            SliverList(delegate: SliverChildListDelegate(buildList()))
          ],
        ),
      ),
    );
  }

  ...
}

上面我们启用了下拉功能,我们提供了随包提供的默认标头,并且在刷新时我们希望延迟,然后指示刷新已完成。我们还将我们的 List 设置在一个CustomScrollView. 因为我们知道我们正在添加一个可折叠的工具栏,所以我们知道将涉及到条子。仅此代码就可以让您在没有任何背景或可折叠应用栏的情况下刷新。

添加可折叠的 AppBar 和图像

要添加 RefreshBackground,我们将创建一个新的小部件,其中根子级是SliverAppBar.

class RefreshBackground extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return SliverAppBar(
      expandedHeight: 200.0,
      flexibleSpace: FlexibleSpaceBar(
          background: Image.network(
        "https://images.unsplash.com/photo-1541701494587-cb58502866ab?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=0c21b1ac3066ae4d354a3b2e0064c8be&auto=format&fit=crop&w=500&q=60",
        fit: BoxFit.cover,
      )),
    );
  }
}

现在我们可以将它添加到我们的列表之上,这就是教程。

 @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.grey[700],
      body: SmartRefresher(
        controller: _refreshController,
        enablePullDown: true,
        header: defaultHeader,
        onRefresh: () async {
          await Future.delayed(Duration(seconds: 1));
          _refreshController.refreshCompleted();
        },
        child: CustomScrollView(
          slivers: [
            RefreshBackground(), // <== Add AppBack background
            SliverList(delegate: SliverChildListDelegate(buildList()))
          ],
        ),
      ),
    );
  }

如果您运行此代码,您应该会在介绍中看到 gif。唯一的区别是折叠时应用栏的颜色。你可以改变它。