我正在从事一个Flutter 项目,想要实现的功能,其中滚动条是隐藏的页面加载时,只有当用户开始滚动显示.我try 了几种方法,但遇到了困难.以下是我当前的代码:

import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:rashi/widgets/spacer.dart';

class Account extends ConsumerWidget {
  const Account({super.key});

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    return Scaffold(
      body: CustomScrollView(
        slivers: <Widget>[
          const SliverAppBar(
            pinned: false,
            snap: true,
            floating: true,
            title: Text('Account'),
          ),
          SliverList(
            delegate: SliverChildBuilderDelegate(
              /// This is test generated list
              (context, index) => ListTile(title: Text('Item #$index')),
              // Builds 1000 ListTiles
              childCount: 100,
            ),
          ),
        ],
      ),
    );
  }
}

如果任何人有在Flight中实现这种类型的滚动条行为的经验,我将非常感激您提供的任何指导或解决方案.

这就是我所期待的:

How I want it to be

推荐答案

Result

您可以使用NotificationListener来检测用户是否正在滚动.

简单地显示/隐藏应用栏的基础上,如果用户正在滚动或没有.

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  bool isScrolling = false;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Material App',
      home: Scaffold(
        body: Scaffold(
          body: NestedScrollView(
            headerSliverBuilder: (context, _) => [
              isScrolling
                  ? SliverAppBar(
                      pinned: true,
                      flexibleSpace: Container(
                        color: Colors.green,
                        child: FlexibleSpaceBar(
                          title: Text(
                            'You are  scrolling',
                            style: TextStyle(color: Colors.black),
                          ),
                        ),
                      ),
                    )
                  : SliverAppBar(),
            ],
            body: NotificationListener<ScrollNotification>(
              onNotification: (scrollNotification) {
                // check if the user is scrolling
                if (scrollNotification is ScrollStartNotification) {
                  setState(() {
                    isScrolling = true;
                  });
                } else if (scrollNotification is ScrollEndNotification) {
                  setState(() {
                    isScrolling = false;
                  });
                }
                return true;
              },
              child: ListView.builder(
                itemCount: 100,
                itemBuilder: (context, index) => ListTile(
                  title: Text('Item $index'),
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }
}

See also

Flutter相关问答推荐

如何在应用栏中将列置于中心

类型flatter doctor get zsh:未找到命令:macO中flatter

如何在flutter文本字段中添加要点条目?

无效字符(位于字符68处)flutter—update—... europe-west1.firebasedatabase.app/

Flutter 翼doctor 显示的错误,我似乎不能修复.问题:系统32、Android工具链、Windows 10 SDK

Android Studio中的Ffltter&;Couchbase:进程C:/Program Files/Git/bin/bash以非零退出值35结束

BottomNavigationBar-我应该使用Container和Align吗?

通过Ffltter应用程序与Docker服务器进行交互以进行身份验证

如何使 dart 函数变得通用?

如何使用 Material3 创建带有高度的完美白色提升按钮?

点击后,将按钮的 colored颜色 禁用/更改一段时间

获取通过列表呈现的相同 TextEditingController 的值

围绕父组件旋转位置组件

如何对齐卡片小部件中的图标按钮?

statefulWidget 无法进行所需更改的问题

如何在 Flutter 中使用简写 IF 禁用单选按钮?

避免长单词中断

如何获取 android 和 Ios (flutter) 的 CircularProgress 指示器?

Flutter 用户过滤器

根据索引/变量更改小部件的 colored颜色