Flutter 通过BottomSheetDialog实现抖音打开评论区,内容自动上推、缩放效果

这篇具有很好参考价值的文章主要介绍了Flutter 通过BottomSheetDialog实现抖音打开评论区,内容自动上推、缩放效果。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、先来看下实现的效果

Flutter 通过BottomSheetDialog实现抖音打开评论区,内容自动上推、缩放效果,Flutter编程,flutter
  • 实现上面的效果需要解决俩个问题
    • 当列表进行向下滑动到顶部的时候,继续滑动可以让弹窗向下收起来
    • 弹出上下拖动的时候,视图内容跟着上下移动、缩放大小

二、实现弹窗上下滑动的时候,动态改变内容区的位置和大小

  • 通过showModalBottomSheet显示底部对话框
showModalBottomSheet(
  context: context,
  isScrollControlled: true,
  backgroundColor: Colors.white,
  transitionAnimationController: _controller,
 
  builder: (_) {
    ///省略部分代码...
  },
);
1、那问题来了,怎么去监听对话框当前显示的高度呢?

可以发现showModalBottomSheet有一个transitionAnimationController参数,这个就是对话框显示的动画控制器了值为[0,1],当全部显示是为1。
那么当将弹窗设为固定高度时,就可以通过这个值进行计算了

  • 假设我们顶部留的最小空间为:宽度 = 屏幕宽度,高度 = 屏幕宽度 / (16 / 9),那么对话框的高度就等与 屏幕高度 - 顶部高度
///屏幕宽度
double get screenWidth => MediaQuery.of(context).size.width;
///屏幕高度
double get screenHeight => MediaQuery.of(context).size.height;
///顶部留的高度
double get topSpaceHeight => screenWidth / (16 / 9);
///对话框高度
double get bottomSheetHeight => screenHeight - topSpaceHeight;
2、监听对话框高度改变

void initState() {
  super.initState();
  _controller = BottomSheet.createAnimationController(this);
  _controller.addListener(() {
    final value = _controller.value * bottomSheetHeight;
    ///更新UI
    _bottomSheetController.sink.add(value);
  });
}


Widget build(BuildContext context) {
  final bottom = MediaQuery.of(context).padding.bottom;
  return ColoredBox(
    color: Colors.black,
    child: Stack(
      children: [
        StreamBuilder<double>(
          stream: _bottomSheetController.stream,
          initialData: 0,
          builder: (_, snapshot) {
            return Container(
              height: screenHeight - snapshot.data!,
              alignment: Alignment.center,
              child: Image.network(
                'https://5b0988e595225.cdn.sohucs.com/images/20200112/75b4a498fdaa48c7813419c2d4bac477.jpeg',
              ),
            );
          },
        ),
      ],
    ),
  );
}

通过上面这样处理,内容区的上移和缩小就已经实现了文章来源地址https://www.toymoban.com/news/detail-702327.html

三、弹窗内容向下滑动,当滑动到顶继续向下滑动时,可以让对话框继续向下滑动(不打断此次触摸事件)

  • 这里借鉴了这位博主的解决方案可以先看一下,https://www.jianshu.com/p/4f2d10750f5c
1、在向下滑动到顶,继续向下的时候,动态改变弹窗内部的高度来达到弹窗下拉的效果,这里本来是想通过改变transitionAnimationController.value的值来改变弹窗的高度,但是实际中发现或的效果不理想,不知道为什么

Widget build(BuildContext context) {
  return StreamBuilder<double>(
    stream: _dragController.stream,
    initialData: widget.height,
    builder: (context, snapshot) {
      return AnimatedContainer(
        height: snapshot.data ?? widget.height,
        duration: const Duration(milliseconds: 50),
        child: Column(
          children: [
            widget.pinedHeader ?? const SizedBox.shrink(),
            Expanded(
              child: Listener(
                onPointerMove: (event) {
                  ///没有滚动到顶部不处理
                  if (_scrollController.offset != 0) {
                    return;
                  }
                  ///获取滑动到顶部开始下拉的位置
                  _startY ??= event.position.dy;
                  final distance = event.position.dy - _startY!;
                  ///弹窗滑动后剩余高度
                  if ((widget.height - distance) > widget.height) {
                    return;
                  }
                  _dragController.sink.add(widget.height - distance);
                  ///剩余弹出高度所占百分比
                  final percent = 1 - distance / widget.height;
                  ///为了处理图片大小缩放需要使用
                  widget.transitionAnimationController.value = percent;
                },
                /// 触摸事件结束 恢复可滚动
                onPointerUp: (event) {
                  _startY = null;
                  if (snapshot.data! <= widget.height * 0.5) {
                    ///下拉到了一半直接关闭
                    widget.transitionAnimationController.animateTo(0,
                        duration: const Duration(microseconds: 250));
                  } else {
                    ///未到一半 恢复展示
                    _dragController.sink.add(widget.height);
                    widget.transitionAnimationController.animateTo(1,
                        duration: const Duration(microseconds: 250));
                  }
                },
                child: SingleChildScrollView(
                  controller: _scrollController,
                  physics: snapshot.data == widget.height
                      ? const ClampingScrollPhysics()
                      : const NeverScrollableScrollPhysics(),
                  child: widget.child,
                ),
              ),
            ),
          ],
        ),
      );
    },
  );
}
2、解决原理:
  • 使用Listener包裹底部可滚动组件,然后监听用户的滑动,当滑动到了最顶部且继续向下滑动就将SingleChildScrollViewphysics设置为不可滚动
  • 同时改变内容的高度,同时也要改变transitionAnimationController.value的值这样内容区才会跟着移动,缩放
  • 最后在触摸结束的时候进行判断是需要收起弹窗还是关闭弹窗

到了这里,关于Flutter 通过BottomSheetDialog实现抖音打开评论区,内容自动上推、缩放效果的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • WordPress实现评论后可显示内容中附件下载地址的方法

    本文实例讲述了WordPress实现评论后可显示内容中附件下载地址的方法。分享给大家供大家参考,具体如下: 最近在做一个项目的时候,有个需求就是希望WordPress网站文章内容里面附件可以评论后才可以下载。网络上面查了会,发现这个功能不难实现,写个简单的函数就可以了

    2023年04月24日
    浏览(40)
  • 【GUI界面软件】抖音评论采集:自动采集10000多条,含二级评论、展开评论!

    目录 一、背景说明 1.1 效果演示 1.2 演示视频 1.3 软件说明 二、代码讲解 2.1 爬虫采集模块 2.2 软件界面模块 2.3 日志模块 三、获取源码及软件 您好!我是@马哥python说,一名10年程序猿。 我用python开发了一个爬虫采集软件,可自动抓取抖音评论数据,并且含二级评论! 为什么

    2024年02月03日
    浏览(45)
  • python通过selenium爬取网页信息,python获取浏览器请求内容,控制已经打开的浏览器

    背景:通过python中直接get或者urlopen打开一些有延迟加载数据的网页,会抓取不到部分信息。 1. 命令行打开chrome,并开启调试端口 (前提,找到chrome安装目录,找到chrome.exe所在路径,添加到环境变量中,例如我的是C:Program FilesGoogleChromeApplication) remote-debugging-port指定远程调试

    2024年02月16日
    浏览(74)
  • 抖音视频评论采集软件|抖音数据抓取工具

            抖音视频评论采集软件是一款基于C#开发的高效、便捷的工具,旨在为用户提供全面的数据采集和分析服务。该软件不仅支持通过进行搜索抓取,还能够通过分享链接进行单个视频的抓取和下载,让用户轻松获取抖音视频评论数据。         其中,批量视频提

    2024年04月11日
    浏览(50)
  • flutter开发实战-video_player插件播放抖音直播实现(仅限Android端)

    flutter开发实战-video_player插件播放抖音直播实现(仅限Android端) 在之前的开发过程中,遇到video_player播放视频,通过查看video_player插件描述,可以看到video_player在Android端使用exoplayer,在iOS端使用的是AVPlayer。由于iOS的AVPlayer不支持flv、m3u8格式的直播,这里video_player播放抖音直

    2024年02月05日
    浏览(42)
  • uniapp 微信小程序仿抖音评论区功能,支持展开收起

    最近需要写一个评论区功能,所以打算仿照抖音做一个评论功能,支持展开和收起, 首先我们需要对功能做一个拆解,评论区功能,两个模块,一个是发表评论模块,一个是评论展示区。接下来对这两个模块进行详细描述。 使用到的技术 uniapp  uview2.0   文章最后我会贴上全

    2024年02月10日
    浏览(82)
  • 抖音直播间弹幕解析:点赞,评论,送礼,进入提示等(2:解析protobuf代码)

    抖音直播间数据抓取打印效果演示 上一章中说了弹幕解析需要了解的知识点以及环境的搭建,本章中深入到代码中去,了解项目的架构和原理以及protobuf 解析实战代码。 现在说一下项目的思路吧: 1. 谷歌浏览器打开live直播间 2. mitmproxy 捕获live.douyin.com http请求并保存响应为指

    2024年02月21日
    浏览(50)
  • 【Flutter应用】Flutter精仿抖音开源

    主要文件: ./lib ├── main.dart ├── mock │ └── video.dart # 假数据 ├── other │ └── bottomSheet.dart # 修改了系统BottomSheet的高度 ├── pages │ ├── cameraPage.dart # 拍摄页(没有实际功能) │ ├── followPage.dart # 略 │ ├── homePage.dart # 主页面,包含tikTokScaffold的

    2024年04月17日
    浏览(31)
  • Python爬携程指定景点评论的用户、评论内容及时间(景点黄龙溪为例)

    整个分享分为下面几个部分: 目录 1.导入所需的库 2.设定三个变量存储从爬取的评论数据中提取的信息 3.爬取指定页面数(total_pages)的评论数据。 4.设定postURL 6.找到景点的poild并填写在代码中 问题1:有时候Poild会被隐藏,所以可能需要多试几次。(或者新开一个浏览器窗口

    2024年02月04日
    浏览(54)
  • Flutter Windows通过嵌入Native窗口实现渲染视频

    第一章 Android使用Texture渲染视频 第二章 Windows使用Texture渲染视频 第三章 Linux使用Texture渲染视频 第四章 全平台FFI+CustomPainter渲染视频 第五章 Windows使用Native窗口渲染视频(本章) 第六章 桌面端使用texture_rgba_renderer渲染视频 使用flutter在Windows上渲染视频,目前掌握的至少有

    2024年02月16日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包