Skip to content

Commit fcca84f

Browse files
committed
完善route功能,添加动态创建fragment的功能
1 parent cf42012 commit fcca84f

File tree

8 files changed

+199
-57
lines changed

8 files changed

+199
-57
lines changed

README.md

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -356,9 +356,13 @@ class LoginActivity: AppCompatActivity() {
356356

357357
binding.btnGoFragment.setOnClickListener {
358358
//在 module-communication-route 可以使用路径拿到 class ,反射新建fragment对象
359-
val clazz = ModuleRoute.builder("/user/UserFragment")
360-
.getClassByPath()
361-
val fragment : Fragment = clazz?.getDeclaredConstructor()?.newInstance() as Fragment
359+
val instance : Any = ModuleRoute.builder("/user/UserFragment")
360+
.putValue("params1","lalla")
361+
.putValue("params2",user)
362+
.go()
363+
instance?.let {
364+
val fragment : Fragment = instance as Fragment
365+
}
362366
//直接使用路由帮助类,需借助上边介绍的通信功能
363367
val fragment : Fragment = `LibUser$$Router`.newUser_UserFragment("lalala",user) as Fragment
364368
supportFragmentManager.beginTransaction().replace(R.id.container,fragment).commit()

app/src/main/java/com/flyjingfish/modulecommunication/SchemeFilterActivity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ import androidx.activity.ComponentActivity
66
import androidx.core.net.toUri
77
import com.flyjingfish.module_communication_annotation.ImplementClassUtils
88
import com.flyjingfish.module_communication_route.ModuleRoute
9+
import com.flyjingfish.module_communication_route.callback.OnNavigationBack
910
import com.flyjingfish.user.TestBean
1011
import com.flyjingfish.user.TestBean2
1112
import com.flyjingfish.user.UserHelper
1213
import com.google.gson.Gson
1314
import java.util.ArrayList
14-
import java.util.Arrays
1515

1616

1717
class SchemeFilterActivity : ComponentActivity() {
Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,24 @@
11
package com.flyjingfish.module_communication_annotation.bean
22

3+
import com.flyjingfish.module_communication_annotation.enums.PathType
4+
import com.flyjingfish.module_communication_annotation.interfaces.NewAny
35
import kotlin.reflect.KClass
46

5-
class PathInfo(val path: String, val clazz: KClass<*>, val tag: Int, val paramsInfo: MutableList<ParamsInfo>){
7+
class PathInfo(
8+
val path: String,
9+
val clazz: KClass<*>,
10+
val tag: Int,
11+
val type: PathType,
12+
private val newAny: NewAny?,
13+
val paramsInfo: MutableList<ParamsInfo>
14+
) {
615

716
/**
817
* 当前页面的 tag 是否存在 [item]
918
*/
1019
fun isExist(item: Int): Boolean {
1120
return tag and item > 0
1221
}
22+
23+
fun newInstance():Any? = newAny?.newInstance()
1324
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.flyjingfish.module_communication_annotation.enums
2+
3+
enum class PathType {
4+
ACTIVITY,FRAGMENT
5+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.flyjingfish.module_communication_annotation.interfaces
2+
3+
interface NewAny {
4+
fun newInstance():Any
5+
}

module-communication-ksp/src/main/java/com/flyjingfish/module_communication_ksp/CommunicationKspSymbolProcessor.kt

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@ import com.flyjingfish.module_communication_annotation.Route
77
import com.flyjingfish.module_communication_annotation.RouteParams
88
import com.flyjingfish.module_communication_annotation.bean.ParamsInfo
99
import com.flyjingfish.module_communication_annotation.bean.PathInfo
10+
import com.flyjingfish.module_communication_annotation.enums.PathType
1011
import com.flyjingfish.module_communication_annotation.interfaces.BaseRouter
1112
import com.flyjingfish.module_communication_annotation.interfaces.BaseRouterClass
1213
import com.flyjingfish.module_communication_annotation.interfaces.BindClass
14+
import com.flyjingfish.module_communication_annotation.interfaces.NewAny
1315
import com.google.devtools.ksp.containingFile
1416
import com.google.devtools.ksp.getAllSuperTypes
1517
import com.google.devtools.ksp.processing.CodeGenerator
@@ -224,6 +226,9 @@ class CommunicationKspSymbolProcessor(
224226
paramsClazz.add(ClassName.bestGuess(
225227
className
226228
))
229+
paramsClazz.add(ClassName.bestGuess(
230+
PathType::class.qualifiedName!!
231+
))
227232
paramsClazz.add(ClassName.bestGuess(
228233
ParamsInfo::class.qualifiedName!!
229234
))
@@ -247,15 +252,17 @@ class CommunicationKspSymbolProcessor(
247252
}
248253
}
249254

250-
val pathInfoStr = "%T(\"$usePath\",%T::class,$tag,mutableListOf<%T>().apply {\n" +
251-
paramsInfoStringBuilder.toString() +
252-
" })"
255+
val pathInfoStr :String
253256

257+
val classMapTypeNames : Array<*>
254258

255-
val classMapTypeNames = paramsClazz.toTypedArray()
256259
val paramListStr = "val paramsInfoList = mutableListOf<%T>()"
257260
// logger.error("paramsInfoStringBuilder=$paramsInfoStringBuilder")
258261
if (symbol.isSubtype("android.app.Activity")){
262+
pathInfoStr = "%T(\"$usePath\",%T::class,$tag,%T.ACTIVITY, null ,mutableListOf<%T>().apply {\n" +
263+
paramsInfoStringBuilder.toString() +
264+
" })"
265+
classMapTypeNames = paramsClazz.toTypedArray()
259266
val classFunName = "get${classKey}Class"
260267
val whatsMyName1 = whatsMyName("go$routeClassName")
261268
if (!emptyRoute){
@@ -365,6 +372,20 @@ class CommunicationKspSymbolProcessor(
365372

366373
routeBuilder.addFunction(whatsMyName1.build())
367374
}else if (symbol.isSubtype("androidx.fragment.app.Fragment") || symbol.isSubtype("android.app.Fragment")){
375+
paramsClazz.add(3,ClassName.bestGuess(
376+
NewAny::class.qualifiedName!!
377+
))
378+
paramsClazz.add(4,ClassName.bestGuess(
379+
className
380+
))
381+
pathInfoStr = "%T(\"$usePath\",%T::class,$tag,%T.FRAGMENT, object :%T{\n" +
382+
" override fun newInstance(): Any {\n" +
383+
" return %T()\n" +
384+
" }\n" +
385+
" },mutableListOf<%T>().apply {\n" +
386+
paramsInfoStringBuilder.toString() +
387+
" })"
388+
classMapTypeNames = paramsClazz.toTypedArray()
368389
val classFunName = "new${classKey}"
369390
val anyClassName = ClassName.bestGuess(Any::class.qualifiedName!!)
370391
val whatsMyName2 = whatsMyName("new$routeClassName")

0 commit comments

Comments
 (0)