玩儿转下拉刷新,FRefresh

FWidget 用心提供精致的组件,助您构建精美的应用。

现在,开发者请集中注意力 🤭。

思考一下 🤔,如何才能构建出下图中的视效呢?

image

经过大脑 🧠 的一番飞速旋转,也许我们最终会发现这其中有诈 😧 !嗯~这不是一个容易的事情啊。

在下拉的过程中,随着滑动距离的变化,我们需要连续处理几个不同阶段的情况:

  1. 临界距离之前的下拉过程

  2. 到达临界距离

  3. 超过临界距离的下拉过程

  4. 自由回弹到刷新位置

  5. 保持刷新状态

  6. 刷新结束,自由回弹到 0 点位置

  7. 未达临界距离回弹到 0 点位置

    . . .

每一个过程都需要我们进行大量的计算和逻辑判断。如果再想随着滑动距离对头部 Widget 作出相应调整,那事情就真是很复杂了。

很焦虑吗?

开发者,大可不必!

因为, FRefresh 出现啦!

FRefresh 是由 【阿里巴巴-飞猪-FliggyMobile 技术团队】 开发维护的 FWidget 系列组件之一。

在过去一段时间中,我们已经先后向社区开放了 5 实用精美的 WidgetFSuperFButtonFSwitchFRadioFFloat ),帮助开发者们更易构建出赏心悦目的应用。

我们很高兴获得了开发者们给予的认同和支持,目前我们已经累计收到了开发者们投出的 440Star

而今天给开发者们献上的 FRefresh ,正是 FWidget 系列组件中的第 6 个成员。

image
image
image
image
image
image

✨ 特性

来看看 FRefresh 都为开发者们准备了些什么:

  • 提供超简单的下拉刷新和上拉加载构建方式

  • 支持局部更新刷新区域和加载区域视图

  • 足够全面的状态机支持

  • 实用的控制器

  • 支持主动触发刷新

image

🛸 传送区

🛸 【传送门:FRefresh Github 主页 - 感谢您的 Star 🌟】

📖 【传送门:FRefresh 文档】

💫 基础版下拉刷新

就要更简单。

image

这是日常开发中我们最常见的下拉刷新例子 🌰。相信我,如果自己想要构建一个这样的效果,会很费劲的!

但如果使用 FRefresh ,情况就完全不同了。

接下来,我们只需要通过简单的几行代码,就能完成这一效果的构建。


FRefresh(
  /// 构建刷新 Header
  header: buildRefreshView(),

  /// 需要传入 Header 区域大小
  headerHeight: 75.0,

  /// 内容区域 Widget
  child: ListView.builder(
      physics: NeverScrollableScrollPhysics(),
      shrinkWrap: true,
      ...
  ),

  /// 进入 Refreshing 后会回调该函数
  onRefresh: () {},
);

完工 🔨!

这就是创建下拉刷新所要做的所有工作。

FRefresh 处理好了一切,开发者只需要全身心关注 Header 区域内容区域 的构建工作就够了。

🚀 进阶版下拉刷新

足够简单,足够高效

image

FRefresh(

  /// 通过 headerBuilder 构建 Header 区域
  headerBuilder: (setter, constraints) {
    return FSuper(

       /// 获取当前 Header 区域可用空间大小
       width: constraints.maxWidth,
       height: constraints.maxHeight,
       ...
       onClick:{
          setter((){
             /// 刷新 Header 区域
          })
       },
    );
  },
  headerHeight: 100.0,

  /// 构建内容区域
  child: GridView.builder(),

  /// 进入 Refreshing 状态后会回调该函数
  onRefresh: () {}
)

FRefresh 提供了一种十分灵活的 Header 区域构建方式,即通过 HeaderBuilder 函数完成构建。

HeaderBuilder 函数中,开发者能够通过参数获取到用于局部刷新 Header 区域的刷新函数 StateSetter ,以及 Header 区域 的实时大小。

这种方式,赋予了 Header 区域 更加开放的创造性。

💫 基础版上拉加载

两种模式,一种风格

image

与下拉刷新对应,上拉加载效果的构建也同样非比寻常的简单。

FRefresh(

  /// 构建 Footer 区域
  footer: LinearProgressIndicator(),

  /// 需要配置 Footer 区域高度
  footerHeight: 20.0,

  /// 构建内容区域
  child: builderContent(),

  /// 进入 Loading 状态后会回调该函数
  onLoad: () { },
)

构建上拉加载也一样足够简单。开发者只需要关注 Footer 区域内容区域 的构建,上拉加载过程中的状态变更、视效控制等就放心交给 FRefresh 好了。

🚀 进阶版上拉加载

不停止追求美的脚步

image

FRefresh(

  /// 通过 FooterBuilder 构建 Footer 区域 Widget
  footerBuilder: (setter) {

    /// 获取刷新状态,局部更新 Footer 区域内容
    controller.setOnStateChangedCallback((state) {
      setter(() {
        ...
      });
    });
    return buildFooter();
  },
  footerHeight: 38.0,
  child: buildContent(),
  onLoad: () {
    controller.finishLoad();
  },
)

FRefresh 也为 Footer 区域 的构建提供了一个构建函数 FooterBuilder 。通过该函数可以获取到只局部刷新 Footer 区域 的刷新函数 StateSetter

这样开发者就能很方便的根据状态或是其它一些条件改变 Footer 区域 的视图了。

很贴心的吧 🥰。

⚙️ FRefreshController

让你掌控全局

image

FRefresh 向开发者提供了贴心的控制器 FRefreshController ,支持诸多便捷的能力。

1. 给 FRefresh 添加控制器


/// 创建 控制器
FRefreshController controller = FRefreshController()

/// 给 FRefresh 配置控制器
FRefresh(
  controller: controller,
)

当开发者创建一个控制器,然后将它设置到一个 FRefresh 中后,控制器就能开始监听这个 FRefresh 的状态,以及对它进行控制了。

2. 停止刷新或加载

当触发刷新状态或加载状态后,通常会进行网络请求等数据处理任务,在这些任务结束后,我们需要停止刷新状态或加载状态。怎么办呢?

  • controller.finishRefresh() 可以停止刷新

  • controller.finishLoad() 可以停止加载

3. 监听状态

controller5.setOnStateChangedCallback((state) {
  /// 刷新状态
  if (state is RefreshState) {
  }
  /// 加载状态
  if (state is LoadState) {
  }
});

通过上面这段简单的代码,就能实现对 FRefresh 状态变化的监听,不论是下拉刷新,还是上拉加载。

4. 滑动监听

controller.setOnScrollListener((metrics) {
  /// 获取滑动信息
});

FRefreshController 添加滑动监听真的是很方便了。接收的参数是 [ScrollMetrics],通过它能获取到诸如 当前滑动距离最大滑动距离是否超出滑动范围 等非常全面的信息。

5. 主动触发刷新

通过 FRefreshController,开发者还能主动触发一次刷新,而且可以指定滑动到触发刷新位置的时长。


controller.refresh(duration: Duration(milliseconds: 2000));

这项功能在很多场景中都大有用处。

想要了解更多详细内容?请访问 FRefresh 官方主页 (PS:别忘了投出一个你认可的 Star 哦 😘)。

😃 如何使用?

在项目 pubspec.yaml 文件中添加依赖:

🌐 pub 依赖方式

dependencies:
  frefresh: ^<版本号>

⚠️ 注意,请到 pub 获取 FRefresh 最新版本号

🖥 git 依赖方式

dependencies:
  frefresh:
    git:
      url: 'git@github.com:Fliggy-Mobile/frefresh.git'
      ref: '<分支号 或 tag>'

⚠️ 注意,分支号 或 tag 请以 FRefresh 官方项目为准。

感觉还不错?请到 《FRefresh》的 Github 主页投出您认可的一个 Star 🌟 吧!

往期组件

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