搓了大半个月屎山的总结(~模块化 默认模糊搜索转换之类的。。~)

尽量写成模块化的

包装器(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)

posted @ 2026-04-05 17:35  气温骤降  阅读(1)  评论(0)    收藏  举报