RouterHelper.kt 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. package com.narutohuo.xindazhou.common.router
  2. import android.app.Activity
  3. import android.content.Intent
  4. import android.os.Bundle
  5. import androidx.activity.result.ActivityResultLauncher
  6. import androidx.activity.result.contract.ActivityResultContracts
  7. import androidx.fragment.app.Fragment
  8. import com.alibaba.android.arouter.launcher.ARouter
  9. /**
  10. * 路由管理器
  11. *
  12. * 统一封装 ARouter 路由跳转,提供便捷的路由调用方式
  13. *
  14. * 使用方式:
  15. * ```kotlin
  16. * // 基础跳转
  17. * RouterHelper.navigate("/user/profile")
  18. *
  19. * // 带参数跳转
  20. * RouterHelper.navigate("/user/profile") {
  21. * putString("userId", "123")
  22. * putString("userName", "张三")
  23. * }
  24. *
  25. * // 带结果回调跳转
  26. * RouterHelper.navigateForResult(activity, "/user/select", 1001) {
  27. * putString("type", "user")
  28. * }
  29. *
  30. * // 获取服务
  31. * val pushService = RouterHelper.getService<IPushService>()
  32. * ```
  33. */
  34. object RouterHelper {
  35. /**
  36. * 基础跳转
  37. *
  38. * @param path 路由路径
  39. */
  40. fun navigate(path: String) {
  41. ARouter.getInstance()
  42. .build(path)
  43. .navigation()
  44. }
  45. /**
  46. * 带参数跳转
  47. *
  48. * @param path 路由路径
  49. * @param params 参数构建器
  50. */
  51. fun navigate(path: String, params: (Bundle.() -> Unit)? = null) {
  52. val postcard = ARouter.getInstance().build(path)
  53. params?.let {
  54. val bundle = Bundle().apply(it)
  55. postcard.with(bundle)
  56. }
  57. postcard.navigation()
  58. }
  59. /**
  60. * 带参数跳转(使用 RouteBuilder)
  61. *
  62. * @param path 路由路径
  63. * @return RouteBuilder,用于链式调用
  64. */
  65. fun build(path: String): RouteBuilder {
  66. return RouteBuilder(path)
  67. }
  68. /**
  69. * 带结果回调跳转(Activity)
  70. *
  71. * @param activity Activity 实例
  72. * @param path 路由路径
  73. * @param requestCode 请求码
  74. * @param params 参数构建器(可选)
  75. */
  76. fun navigateForResult(
  77. activity: Activity,
  78. path: String,
  79. requestCode: Int,
  80. params: (Bundle.() -> Unit)? = null
  81. ) {
  82. val postcard = ARouter.getInstance().build(path)
  83. params?.let {
  84. val bundle = Bundle().apply(it)
  85. postcard.with(bundle)
  86. }
  87. postcard.navigation(activity, requestCode)
  88. }
  89. /**
  90. * 注册带结果回调的路由跳转(Fragment - 新 API)
  91. *
  92. * 使用 ActivityResultLauncher,推荐使用此方法
  93. *
  94. * 使用方式:
  95. * ```kotlin
  96. * // 在 Fragment 中注册
  97. * private val resultLauncher = RouterHelper.registerForResult(this) { result ->
  98. * if (result.resultCode == Activity.RESULT_OK) {
  99. * val data = result.data
  100. * // 处理结果
  101. * }
  102. * }
  103. *
  104. * // 跳转
  105. * RouterHelper.navigateForResult(resultLauncher, "/user/select") {
  106. * putString("type", "user")
  107. * }
  108. * ```
  109. *
  110. * @param fragment Fragment 实例
  111. * @param onResult 结果回调
  112. * @return ActivityResultLauncher,配合 navigateForResult(launcher, path, params) 使用
  113. */
  114. fun registerForResult(
  115. fragment: Fragment,
  116. onResult: (androidx.activity.result.ActivityResult) -> Unit
  117. ): ActivityResultLauncher<Intent> {
  118. return fragment.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
  119. onResult(result)
  120. }
  121. }
  122. /**
  123. * 带结果回调跳转(使用 ActivityResultLauncher - 新 API)
  124. *
  125. * 配合 registerForResult() 使用
  126. *
  127. * @param launcher ActivityResultLauncher(通过 registerForResult() 获取)
  128. * @param path 路由路径
  129. * @param params 参数构建器(可选)
  130. */
  131. fun navigateForResult(
  132. launcher: ActivityResultLauncher<Intent>,
  133. path: String,
  134. params: (Bundle.() -> Unit)? = null
  135. ) {
  136. val postcard = ARouter.getInstance().build(path)
  137. params?.let {
  138. val bundle = Bundle().apply(it)
  139. postcard.with(bundle)
  140. }
  141. val intent = postcard.navigation() as? Intent
  142. if (intent != null) {
  143. launcher.launch(intent)
  144. }
  145. }
  146. /**
  147. * 带结果回调跳转(Fragment - 已废弃)
  148. *
  149. * @deprecated 使用 registerForResult() 替代
  150. * @param fragment Fragment 实例
  151. * @param path 路由路径
  152. * @param requestCode 请求码
  153. * @param params 参数构建器(可选)
  154. */
  155. @Deprecated(
  156. message = "使用 registerForResult() 替代",
  157. replaceWith = ReplaceWith(
  158. "val launcher = RouterHelper.registerForResult(fragment) { result -> /* 处理结果 */ }\n" +
  159. "val intent = ARouter.getInstance().build(path).with(bundle).navigation() as Intent\n" +
  160. "launcher.launch(intent)"
  161. )
  162. )
  163. @Suppress("DEPRECATION")
  164. fun navigateForResult(
  165. fragment: Fragment,
  166. path: String,
  167. requestCode: Int,
  168. params: (Bundle.() -> Unit)? = null
  169. ) {
  170. val postcard = ARouter.getInstance().build(path)
  171. params?.let {
  172. val bundle = Bundle().apply(it)
  173. postcard.with(bundle)
  174. }
  175. fragment.startActivityForResult(postcard.navigation() as Intent, requestCode)
  176. }
  177. /**
  178. * 获取服务实例
  179. *
  180. * @param path 服务路径(可选,如果为 null 则通过类型查找)
  181. * @return 服务实例,如果未找到返回 null
  182. */
  183. inline fun <reified T> getService(path: String? = null): T? {
  184. return try {
  185. if (path != null) {
  186. ARouter.getInstance().build(path).navigation() as? T
  187. } else {
  188. ARouter.getInstance().navigation(T::class.java)
  189. }
  190. } catch (e: Exception) {
  191. null
  192. }
  193. }
  194. /**
  195. * 路由构建器(链式调用)
  196. */
  197. class RouteBuilder(private val path: String) {
  198. private val bundle = Bundle()
  199. /**
  200. * 添加字符串参数
  201. */
  202. fun withString(key: String, value: String): RouteBuilder {
  203. bundle.putString(key, value)
  204. return this
  205. }
  206. /**
  207. * 添加整数参数
  208. */
  209. fun withInt(key: String, value: Int): RouteBuilder {
  210. bundle.putInt(key, value)
  211. return this
  212. }
  213. /**
  214. * 添加布尔参数
  215. */
  216. fun withBoolean(key: String, value: Boolean): RouteBuilder {
  217. bundle.putBoolean(key, value)
  218. return this
  219. }
  220. /**
  221. * 添加长整数参数
  222. */
  223. fun withLong(key: String, value: Long): RouteBuilder {
  224. bundle.putLong(key, value)
  225. return this
  226. }
  227. /**
  228. * 添加 Parcelable 参数
  229. */
  230. fun withParcelable(key: String, value: android.os.Parcelable): RouteBuilder {
  231. bundle.putParcelable(key, value)
  232. return this
  233. }
  234. /**
  235. * 添加 Serializable 参数
  236. */
  237. fun withSerializable(key: String, value: java.io.Serializable): RouteBuilder {
  238. bundle.putSerializable(key, value)
  239. return this
  240. }
  241. /**
  242. * 执行跳转
  243. */
  244. fun navigate() {
  245. ARouter.getInstance()
  246. .build(path)
  247. .with(bundle)
  248. .navigation()
  249. }
  250. /**
  251. * 执行跳转(带结果回调)
  252. */
  253. fun navigateForResult(activity: Activity, requestCode: Int) {
  254. ARouter.getInstance()
  255. .build(path)
  256. .with(bundle)
  257. .navigation(activity, requestCode)
  258. }
  259. }
  260. }