Flutter3 仿抖音、豆瓣、知乎、番茄小说实战开发,太酷了吧

332 阅读3分钟

最近用flutter做了一个评论弹窗的功能,本来以为很简单的烂大街的一个功能,结果却遇到了不少的问题,而且这些问题我觉得很有意义,以至于我觉得我如果分享出来可能会对其他人很有帮助。

要做一件事情可能会很容易,但做好一件事情却很难~

常见产品

粗略的截了一些图:抖音、豆瓣、知乎、番茄小说

这些产品的评论功能基本都是这种弹窗或者说是滑动面板的模式:

需要项目源码可加微信

wx.jpg

flutter教程

flutter中文官方文档

抖音/豆瓣

知乎/番茄小说

交互细节

当认真的体验了这几款产品后,发现有这些特点:

列表与下拉手势联动面板顶部下拉手势查看更多回复弹起键盘
抖音支持支持点击展开滚动定位
豆瓣支持支持点击展开评论框顶部显示内容
知乎支持不支持跳转新页面无处理
番茄小说支持支持跳转新页面滚动定位

大概梳理总结这么几点:

  1. 这个弹窗并不是一个简单的dialog,其实是一个带有手势交互的滑动面板
  2. 手势向上可以正常滑动列表,手势向下滑动列表到顶部后可触发下拉手势关闭弹窗
  3. 即使列表向上滚动一段距离后,仍然可以滑动顶部触发下拉手势关闭弹窗
  4. 点击列表某一项弹起键盘后,普遍是将要回复的那一条定位到评论框的上方
  5. 查看更多回复,抖音/豆瓣是直接在当前页面展开,知乎/番茄小说是一个跳转到新页面

我相信这几款产品基本都是用android原生去写的,那么flutter是否实现和它们一样的用户体验呢?

其实我最初想到的就是用showModalBottomSheet去从底部弹一个窗出来,但是BottomSheet本身并没有处理与列表的滑动交互问题,如果凑合着其实也还行,就是缺少了下拉手势的交互。

所以我在flutter社区找到了sliding_up_panel,这是一个很受欢迎的库,我打算基于这个库来实现评论功能

至于实现效果,最终是选择了番茄小说的交互效果:

列表与下拉手势联动面板顶部下拉手势查看更多回复弹起键盘
番茄小说支持支持跳转新页面滚动定位

实现效果

那些基本的代码就不细讲了,一顿操作下来,基本功能成型:

接下来说的难点解决暂时也不贴具体的源码了,以讲思路为主,部分是真实的,部分是伪代码

最终的源码我会贴到文章末尾~

难点解决

1. 面板中存在多个列表时,下拉手势异常(局部路由存在多个页面引起)

看一下官方文档的说明:

PropertiesDescription
panelBuilder [beta]NOTE: This feature is still in beta and may have some problems. Please open an issue on GitHub if you encounter something unexpected.Provides a ScrollController to attach to a scrollable object in the panel that links the panel position with the scroll position. Useful for implementing an infinite scroll behavior. If panel and panelBuilder are both non-null, panel will be used.

panelBuilder会回调一个ScrollController,ListView能跟面板手势连接1的原因就是根据ScrollController的offset来判断哪个时机能滚动面板

目前我们有一个列表页,点击列表项还能跳转到一个详情页,两个页面都存在ListView,那么目前在panelBuilder只提供一个ScrollController的情况下,1只能做到在列表页与面板有手势的联动,跳转到详情页后将无法联动面板,因为ScrollController的offset方法只适用于ScrollController仅仅attach一个滚动视图的情况

wx.jpg