Flutter高阶用法之仿写bibili

项目框架及架构

image.png

技术栈:

1.必备技能

  • 自定义组件
  • 布局技巧
  • 扁平化布局
  • 调试技巧
  • 沉浸式状态栏
  • 自定义主题
  • Dark Mode
  • 依赖冲突
  • 构建&打包

Flutter集成与打包Android应用
Flutter集成与打包iOS应用

2.核心原理

  • Flutter路由原理剖析
  • Flutter渲染原理剖析
  • Flutter图片加载与缓存原理剖析
  • 组件化原理和方案剖析
  • 播放器源码分析

3.网络和存储

  • 网络层管理框架
    • 请求可配置
    • 统一异常和返回处理
    • 支持Adapter模式
    • 支持拦截器
    • 无缝切换http和dio
  • Dao层设计
  • 统一缓存管理框架hi_cache

4.路由&导航

  • 监听路由页面跳转
  • 页面级生命周期实现
  • 路由页面栈管理
  • 未登录拦截
  • Android物理返回键兼容处理
  • schema跳转
  • tabBar切换监听

5.图片&动画

  • 主流图片库对比与选择
  • 图片缓存
  • 动画必备技能
    • AnimatedWidget
    • AnimatedBuilder
    • Tween
    • AnimationController
    • Animation
  • Lottie动效
  • 高斯模糊
  • 登录动效
  • 展开动效
  • 视觉差滚动动效
  • 弹幕播放动效

6.视频技术

  • 主流视频播放器分析
  • 播放器组件封装
  • 自定义播放器UI
  • 播放器交互实现
  • 沉浸式播放
  • 全屏播放

7.状态管理

  • 主流状态管理框架provider、bloc、redux分析
  • ProxyProvider、MultiProvider、Consumer
  • provider性能优化

8.性能调优

  • 界面帧率优化(帧率提升70%)


    image.png

Flutter 性能优化流畅度优化方案

  • APP包大小瘦身(包大小减少66%)

Flutter包体大小优化

  • 页面秒开
  • 内存优化
  • build()方法优化
  • 列表优化方法
  • 图片缓存优化

10.稳定性优化

  • 异常捕获与上报

Flutter异常捕获

  • 测试之道
    • 单元测试
    • Widget测试
    • 集成测试

Flutter测试之道

11.架构技术

组件化方案

  • 基于可重用的目的,将一个大型App拆分成多个独立的组件或模块。
    • 每一个独立的组件都是一个单独的系统,可以单独维护、升级甚至直接替换,也可以依赖于别的独立组件
    • 只要组件提供的功能不发生变化,就不会影响其他软件和软件系统的整体功能
    • 组件化的中心思想是将独立的功能进行拆分
  • 颗粒度拆分原则
    • 单一性原则
      • 每个组件仅提供一个功能(分而治之,每个组件都有自己固定的职责,专注做一件事)
      • 当你遇到不知道该放哪的代码时,就需要重新思考组件的设计和职责了
    • 抽象化原则
      • 组件提供的Api应尽量稳定,具有高复用性
      • (对外暴露的接口很少发生变化,做好功能抽象和接口设计,把所有可能变化的因子都在组件内做好适配,不要暴露给她它的调用方)
    • 稳定性原则
      • 不要让稳定的组件依赖不稳定的组件
      • 假如:A组件依赖了B组件,如果A组件很稳定,但是B组件经常变化,那么A组件就会跟着B的变化而经常适配从而变得不稳定了
    • 自完备性
      • 组件要尽可能自给自足,减少对其他底层组件的依赖,达到代码可复用的目的。
      • 比如:A组件只是依赖某个大B组件中的某个方法,这是更好的处理方式是:剥离A组件对B组件的依赖,直接把这个方法拷贝到A组件中。
  • 组件化实施步骤
    • 剥离与业务无关的基础功能
      • 网络操作
      • 本地缓存
      • 第三方库封装
        • 考虑到后续的维护适配成本,最好再封装一层,使项目不直接依赖外部代码,方便后续更新或替换
        • 如:基于flutter_swiper 封装了hi_banner等
      • UI组件等
      • 将它们封装为独立的基础库后,我们在项目里用pub来管理
    • 抽象业务模块
      • 登录模块
      • 首页模块
      • 详情模块
      • 排行榜模块等
      • 遵循先粗后细,只要能将大体划分清晰的业务组件进行拆分,后续就可以通过分布迭代、局部微调,最终实现整个业务项目的组件化。
    • 最小化服务能力
      • 根据上面的颗粒度拆分原则修正各个组件下的依赖。以及最小化对外暴露的能力

Flutter网络层框架hi_net架构

  • 对于繁杂的业务网络层所面临的挑战
    • 切换成本高:第三方库存在不维护切换成本高的风险
    • 接口管理不便:大中型APP接口众多,不方便管理
    • 重复代码多:网络操作和业务代码耦合严重,不利于扩展
    • 开发效率低:不同三方库使用方式不统一,步骤繁琐开发效率低
  • hi_net架构设计
    • 1.支持网络库插拔设计,且不干扰业务层
    • 2.简单易用,支持配置来进行请求
    • 3.Adapter设计,扩展性强
    • 4.统一异常和返回处理
image.png

统一缓存管理框架hi_cache架构

  • 封装页面框架HiBaseTabState

12.软技能

  • 架构思想
  • 框架封装和架构搭建的能力
  • 优秀框架的封装思路
  • 疑难问题解决的方法论

2.快捷键

①AndroidStudio

image.png

②VSCode

image.png

补充

  • Flutter布局嵌套过深导致代码可读性变差,通过代码抽取成多个method或widget减少嵌套层级
  • 对第三方插件使用: 使用频率较高时对库进行封装,较少对业务代码无侵入,扩展性好
  • FractionallySizedBox填满整个宽度
  • Flexible填充剩余空间
  • 抽取工具类,组件化时方便组件下沉
  • 将通用的代码提取成通用的类、方法或组件
    • 将Tab组件通用代码拆成HiTab组件实现代码的复用
  • 对于视频详情页数据处理
    • 默认是从上个视频列表传递过来model
    • 数据加载完成后给model重新赋值
    • 【用户在列表停留过久时,数据有可能不是最新的】
  • 熟悉扁平化布局,減少嵌套地狱实现思路
  • 熟悉页面加载优化并能实现页面秒开
  • 状态栏样式(前台/后台切换变为白色/黑色)
    • 监听App应用的生命周期变化,做兼容处理 didChangeAppLifecycleState

列表图片的优化:

  • 内存缓存
  • 本地缓存

图片内存缓存

Flutter图片是支持内存缓存的,默认情况下Flutter支持1000张图片缓存到本地,并且这些图片的总计大小不得超过100MB。如果超过那么Flutter会根据LRU算法移除先前缓存的图片。所以我们可以适当调整缓存大小来增加列表图片加载的性能:

PaintingBinding.instance.imageCache.maximumSize= 2000;//最多2000张
PaintingBinding.instance.imageCache.maximunSizeBytes = 200 << 20;//最大缓存阈值

注意:图片缓存会对内存造成一定的压力,不建议内存缓存设置过大

图片本地缓存

如果想增加本地缓存可以借助插件来完成:

# 图片加载
cached_network_image: ^3.1.0

列表常驻内存

默认情况下放在PageView中的页面切换走时会被销毁,再次切换回来会导致页面被重新创建,如果页面中有列表那么整个列表将被重新加载,降低用户体验。
解决:让页面的State实现 AutomaticKeepAliveClientMixin:

class _HomeTabPageState extends State<HomeTabPage> with AutomaticKeepAliveClientMixin
{
  
  @override
  bool get wantKeepAlive => true;
}

列表数量不足时无法下拉刷新和上拉加载更多,怎么处理?

StaggeredGridView.countBuilder(
  physics: const AlwaysScrollableScrollPhysics()
)

HiState处理页面状态异常

  • 处理页面状态异常
  • setState() called after dispose()问题分析【在dispose之后调用setState会触发此问题】

ListView顶部多出间距处理

MediaQuery.removePadding(
  removeTop: true,
  context: context,
  child:ListView()
)

图片渐变加载处理

transparent_image: ^2.0.0-nullsafety.0

解决iOS9/Android无法铭文传输的问题【http链接】

iOS

Info.plist中添加

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
  <true/>
</dict>

Android

AndroidManifest.xml中添加

android:usesCleartextTraffic="true"
tools:targetApi="28"

如:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.example.flutter_bili">
      <application
        android:label="flutter_bili"
        android:icon="@mipmap/ic_launcher"
        android:usesCleartextTraffic="true"
        tools:targetApi="28"
        >

源码地址:
https://gitee.com/flutter_steven/flutter_bilibili.git

©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容