搓了大半个月屎山的总结(~模块化 默认模糊搜索转换之类的。。~)
尽量写成模块化的
包装器(Wrapper)可以不用,但是一堆函数列在一起要整洁(毕竟用了Warpper也写得一样多还不好理解(x
模块化
比如
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun SettingsScreen(onBack: () -> Unit) {
val context = LocalContext.current
val fragmentManager = (context as? FragmentActivity)?.supportFragmentManager
var hasNavigatedBack by remember { mutableStateOf(false) }
// Prevent double click
Scaffold(
topBar = {
TopAppBar(
title = { Text("设置") },
navigationIcon = {
IconButton(
onClick = {
if (!hasNavigatedBack) {
hasNavigatedBack = true
onBack()
}
}
) {
Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = null)
}
}
)
}
) { padding ->
val containerId = remember { android.view.View.generateViewId() }
val fragmentTag = remember(containerId) { "prefs_fragment_$containerId" }
AndroidView<FragmentContainerView>(
factory = { ctx ->
FragmentContainerView(ctx).apply {
id = containerId
}
},
modifier = Modifier
.padding(padding)
.fillMaxSize()
)
DisposableEffect(containerId) {
val fragment = org.primftpd.prefs.FtpPrefsFragment()
fragmentManager?.beginTransaction()
?.replace(containerId, fragment, fragmentTag)
?.commit()
onDispose {
fragmentManager?.findFragmentByTag(fragmentTag)?.let { existingFragment ->
fragmentManager.beginTransaction()
.remove(existingFragment)
.commitAllowingStateLoss()
}
}
}
}
}
写成
FragmentContainerScreen(
"test1",
{org.primftpd.ui.PftpdFragment()},
{navController.popBackStack()}
)
//再onNavigate("test1")调用
//。。。。。。
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun FragmentContainerScreen(
title: String,
fragmentFactory: () -> androidx.fragment.app.Fragment, // 传入 Fragment 的构造方法
onBack: () -> Unit
) {
val context = LocalContext.current
val fragmentManager = (context as? FragmentActivity)?.supportFragmentManager
var hasNavigatedBack by remember { mutableStateOf(false) }
Scaffold(
topBar = {
TopAppBar(
title = { Text(title) },
navigationIcon = {
IconButton(
onClick = {
if (!hasNavigatedBack) {
hasNavigatedBack = true
onBack()
}
}
) {
Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = null)
}
}
)
}
) { padding ->
val containerId = remember { android.view.View.generateViewId() }
val fragmentTag = remember(containerId) { "fragment_$containerId" }
AndroidView<FragmentContainerView>(
factory = { ctx ->
FragmentContainerView(ctx).apply {
id = containerId
}
},
modifier = Modifier
.padding(padding)
.fillMaxSize()
)
DisposableEffect(containerId) {
val fragment = fragmentFactory() // 在这里调用传入的构造器
fragmentManager?.beginTransaction()
?.replace(containerId, fragment, fragmentTag)
?.commit()
onDispose {
fragmentManager?.findFragmentByTag(fragmentTag)?.let { existingFragment ->
fragmentManager.beginTransaction()
.remove(existingFragment)
.commitAllowingStateLoss()
}
}
}
}
}
但是我查了半天之后这个玩意其实是可以用AndroidFragment<org.primftpd.prefs.FtpPrefsFragment>()代替的。摆了不想改了
GitHub按 / 本身的搜索是模糊的
谁不想急头白脸半天什么东西都搜不到呢
可以指定字符串取消匹配,repo:rD227/shizuku-ftp "extends Fragment"
可以-去掉某些词
还可以用正则 (虽然我觉得这个东西长得不像正则
如repo:rD227/shizuku-ftp /extends\s+Fragment\b/
\s+:匹配一个或多个空格
\b:匹配单词边界,确保搜到的是 Fragment 而不是 FragmentXXXX
最后随便写点(用正常的东西
EventBus(难以调试),应该用 ViewModel
FragmentManager本来就没办法写@composable那样的可以预览组合的东西,管理回退之类的还需要手动 复制继承了这样的仓库(或者没得选,要不全自己重新写)那没辙了 所以我复制重写 和 重新建房子都试试看感觉吧
| A G | Fra | Nav | Activi |
|---|---|---|---|
| 管理方式 | 手动 add/replace/commit | 声明式。通过图形化路由表管理 | 系统级。由 OS 管理 Activity 栈 |
| 回退栈 | 手动 | 自动管理。逻辑清晰且可预测 | 自动管理。受 LaunchMode 影响 |
| 参数传递 | Bundle (容易拼错 Key) | Safe Args (插件自动生成代码,类型安全) | Intent (容易拼错 Key) |
| 转场动画 | 需在事务中手动指定 | 在 XML 中全局统一配置 | 需使用 overridePendingTransition |
| 开销 | 极轻量 | 轻量 (基于 Fragment) | 较重。涉及进程/系统的窗口切换 (A G) |

浙公网安备 33010602011771号