服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

开源项目分享:一个支持 Activity/Fragment/Compose 的全功能路由框架

日期: 来源:AndroidPub收集编辑:

作者:Season3266
https://juejin.cn/post/7167760843021484039

Butterfly 是一个全功能的路由框架,不仅支持Activity、Fragment和DialogFragment,只支持 Compose UI的路由。小巧灵活,功能强大,提供了统一的API,你无需关心目的地是什么,在哪里,只需要提供一个scheme,Butterfly 便会导航至正确的地方。

话不多说,先看下Butterfly支持的功能列表。

功能列表

  • 支持导航Activity
  • 支持导航Fragment
  • 支持导航DialogFragment
  • 支持导航Compose UI
  • 支持导航Action
  • 支持导航参数传递和解析
  • 支持获取导航返回结果
  • 支持导航拦截器
  • 支持Fragment和Compose UI回退栈
  • 支持Fragment和Compose UI组管理
  • 支持Fragment和Compose UI启动模式,如SingleTop、ClearTop
  • 支持组件化通信

导航和参数传递

耳听为虚,眼见为实,如此强大的功能,没有几个示例怎么能行,来看一眼基本的导航功能:

@Agile("test/activity")
class AgileTestActivity : AppCompatActivity()

@Agile("test/fragment")
class TestFragment : Fragment()

@Agile("test/dialog")
class TestDialogFragment : DialogFragment()


//导航
Butterfly.agile("test/xxx").carry()

//或者导航并获取返回数据
Butterfly.agile("test/xxx")
    .carry {
        val result = it.getStringExtra("result")
        binding.tvResult.text = result
    }

如上所示,导航就是这么简单,无论目的地是什么、在何方,只需要一个scheme即可完成路由跳转。 scheme没有任何限制,可以是任意字符串,也可以是标准scheme,如butterfly://home/path等。

在导航的过程中,参数传递也是必不可少的一环,Butterfly提供两种方式供你选择,一是通过拼接scheme的形式,如test/activity?paramA=123&paramB=abc,即可将paramA和paramB传递至目的地,二是通过调用params方法,传递需要的数据,如:

//拼接scheme
Butterfly.agile("test/scheme?a=1&b=2").carry()

//调用params
Butterfly.agile("test/scheme?a=1&b=2")
    .params("intValue" to 1)
    .params("booleanValue" to true)
    .params("stringValue" to "test value")
    .carry()

如上所示,拼接scheme和调用params方法可以同时进行,在导航目的地可以获取到传递的所有的参数,params方法可以传递Bundle支持的任意类型的参数。

在目的地接受参数:

//在导航目的地页面,可通过参数的key字段来获取传递的参数值
@Agile("test/scheme")
class AgileTestActivity : AppCompatActivity() {
    val a by lazy { intent?.getStringExtra("a") ?: "" }
    val b by lazy { intent?.getStringExtra("b") ?: "" }
    val intValue by lazy { intent?.getIntExtra("intValue", 0) ?: 0 }
}
//除了手动解析参数以外,还可以装备Bracer来实现全自动进行参数解析
@Agile("test/scheme")
class AgileTestActivity : AppCompatActivity() {
    val a by params<String>()
    val b by params<String>()
    val intValue by params<Int>()
}

Bracer 使用方式详情见:  https://github.com/ssseasonnn/Bracer

Compose 导航

Compose 作为Android全新的UI框架异军突起,越来越多的项目正在大量使用Compose,因此支持Compose导航已经刻不容缓。

@Agile("test/compose")
@Composable
fun HomeScreen() {
    Box {
        ...
    }
}

//导航到HomeScreen页面
Butterfly.agile("test/compose").carry()

如上所示,Compose的导航和Activity或Fragment的导航完全一致,统一的API使得简单易用程度得到更进一步的提高。

Compose 导航中的参数传递和获取与Activity或Fragment几乎相同,传递参数同样支持拼接scheme和调用params参数。获取参数只需要给Compose组件添加一个Bundle参数,随后即可通过该bundle参数获取导航中传递的参数。

@Agile("test/compose")
@Composable
fun HomeScreen(bundle: Bundle) {
    val a by bundle.params<Int>()
    val b by bundle.params<Int>()
    val booleanValue by bundle.params<Boolean>()

    Box {
        Text(text = a)
    }
}

//拼接scheme
Butterfly.agile("test/compose?a=1&b=2").carry()

//或者调用params
Butterfly.agile("test/compose?a=1&b=2")
    .params("intValue" to 1)
    .params("booleanValue" to true)
    .params("stringValue" to "test value")
    .carry()

路由拦截器

拦截器是一个很实用的功能,可以提供强大的路由控制功能,如登录检测、AB测试等功能。Butterfly提供两种作用域的拦截器:全局拦截器和一次性拦截器,可针对不同使用场景灵活选择。

首先定义好拦截器功能:

//自定义拦截器
class TestInterceptor : ButterflyInterceptor {
    override fun shouldIntercept(agileRequest: AgileRequest): Boolean {
        //检测是否需要拦截
        return true
    }

    override suspend fun intercept(agileRequest: AgileRequest) {
        //处理拦截逻辑
        println("intercepting")
        delay(5000)
        println("intercept finish")
    }
}

配置全局拦截器:

//添加全局拦截器
ButterflyCore.addInterceptor(TestInterceptor())

//跳过所有全局拦截器
Butterfly.agile("test/scheme").skipGlobalInterceptor().carry()

配置一次性拦截器:

//仅当前导航使用该拦截器
Butterfly.agile("test/scheme")
    .addInterceptor(TestInterceptor())
    .carry()

拦截器提供了suspend的intercept方法,聪明的你应该一眼就能明白它的强大之处。

相关阅读

  • 由浅入深了解 APK 构建流程

  • 概述APK构建流程涉及许多将项目转换成 Android 应用软件包 (APK) 的工具和流程。构建流程非常灵活,因此了解它的一些底层工作原理会很有帮助。APK的详细构建流程稍微有点复杂
  • 突发!刚刚正式公布:全体公考人狂欢吧!

  • 免费公考培训政策解读两会改革方案明确指出:中央整体将被精简,缩编,比例可达5%!2024年,是考公上岸最好的年份!为提升全体考公人竞争优势,增加上岸几率!全国国家公务员培训单位,即日起
  • 揭秘 TheRouter:解锁跨模块依赖注入的奥秘

  • 这是 JsonChao 的第 346 期分享本文作者——张涛(货拉拉)TheRouter用于跨模块通信设计的ServiceProvider,核心设计思想是参考了SOA(面向服务架构)的设计方式。具体到 Android
  • TikTok二面:聊聊二维码扫码登录的原理

  • 在日常生活中,二维码出现在很多场景,比如超市支付、系统登录、应用下载等等。了解二维码的原理,可以为技术人员在技术选型时提供新的思路。对于非技术人员呢,除了解惑,还可以引导
  • 可以有,给你的App添加自定义表情!

  • 安卓进阶涨薪训练营,让一部分人先进大厂大家好,我是皇叔,最近开了一个安卓进阶涨薪训练营,可以帮助大家突破技术&职场瓶颈,从而度过难关,进入心仪的公司。详情见文章:没错!皇叔开了
  • 泰山游客爆满!从山脚堵到山顶

  • 3月25日是泰山免门票开放的最后一个周末,吸引了全国各地的游客前来,据报道,景区游客爆满,内部人挤人,工作人员高喊“两棵松树之间往回走”。从现场拍摄的视频看,游客们可谓是摩肩
  • 西域健康丨甲流来袭,这些预防对策要牢记!

  • 近期,全国多个省市流感疫情呈现明显上升趋势,根据国家疾控中心报告,流感活动水平上升主要是由甲型流感病毒中的甲型H1N1亚型所致(摘自2023年3月8日中国疾病预防控制中心发布信
  • “市局的”掏手铐威胁他人?当地回应

  • 近日,有网友发文称,河北保定一男子在路上与人发生冲突后,自称“是市局的人”,还掏出一副手铐威胁对方。25日,保定晚报发文称,警方回应该人系某平台网约车司机,非公职人员,已被公安

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四

最新文章

  • 2 小时入门 Jetpack Compose (下) | 开发者说·DTalk

  • 本文原作者: 朱涛,原文发布于: 朱涛的自习室在上一篇文章《 2 小时入门 Jetpack Compose (上) 》里,我们已经完成了 Splash 页面的 UI 和动画了。这篇文章,让我们来完成:「首页
  • 由浅入深了解 APK 构建流程

  • 概述APK构建流程涉及许多将项目转换成 Android 应用软件包 (APK) 的工具和流程。构建流程非常灵活,因此了解它的一些底层工作原理会很有帮助。APK的详细构建流程稍微有点复杂