M8Test Help

导航

M8Test 使用 jetpack compose navigation 实现页面间的跳转, 并且提供命令实现页面间跳转.

导航列表

点击悬浮菜单中导航列表按钮

51

可以看到所有已经注册的页面

52

点击可以查看如何通过命令跳转到该页面

53

通过命令实现导航功能(页面跳转)

点击悬浮菜单中运行命令按钮

35

输入需要执行的命令后点击运行图标即可

36

自定义导航

如果想要自定义导航的话需要通过插件实现, 如果您还不会开发插件可以先查看 插件开发

  1. 构建参数列表, 如果没有的话可以省略此步骤

  1. 构建导航对象 (BaseNavigation)

  1. 在需要时通过 NavigationUtils.register 注册导航

  1. 在需要时通过 NavigationUtils.unregister 取消注册导航

package com.m8test.common.navigation import android.widget.Toast import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import com.m8test.compose.widget.BackTopBarScaffold import com.m8test.navigation.api.Argument import com.m8test.navigation.impl.BaseNavigation import com.m8test.navigation.impl.OptionArgument import com.m8test.navigation.impl.PositionalArgument import com.m8test.plugin.api.ApkPluginProvider import com.m8test.plugin.impl.AbstractComposablePluggableApkPlugin import com.m8test.util.NavigationUtils /** * Description TODO * * @date 2025/01/14 20:47:38 * @author M8Test, [email protected], https://m8test.com */ class NavigationPlugin(apkPluginProvider: ApkPluginProvider) : AbstractComposablePluggableApkPlugin(apkPluginProvider) { private var isRegistered = false private val examples: (String) -> List<String> = { commandName -> listOf( "$commandName m8test_positional_argument1 --optional_argument=optional_argument", "$commandName m8test_positional_argument2", ) } private val arguments: List<Argument> = listOf( // 可选参数, 以 -- 开头 OptionArgument( name = "optional_argument", required = false, defaultValue = "optional_argument", nullable = true, description = "optional argument", checkValid = { null } ), // 必选参数 PositionalArgument( name = "positional_argument", required = true, defaultValue = "positional_argument", nullable = false, description = "positional argument", checkValid = { Toast.makeText( apkPluginProvider.getPlugin().getApplication(), it, Toast.LENGTH_SHORT ).show() if (it?.startsWith("m8test") == true) null else "must start with m8test" } ), ) private val navigation = BaseNavigation( route = "test_navigation", arguments = arguments, examples = examples, content = { navHostController, arguments -> BackTopBarScaffold( titleText = "Test Navigation", onBackPress = { navHostController.popBackStack() }) { paddingValues -> LazyColumn(modifier = Modifier.padding(paddingValues)) { items(arguments.toList()) { Text(text = "${it.first}: ${it.second}") } } } }) @Composable override fun Content() { Column { var r by remember { mutableStateOf(isRegistered) } TextButton(onClick = { if (r) NavigationUtils.unregister(this@NavigationPlugin, navigation) else NavigationUtils.register(this@NavigationPlugin, navigation) r = !r isRegistered = r }) { Text(text = if (r) "Unregister" else "Register") } TextButton(onClick = { NavigationUtils.updateGraph() }) { Text(text = "Update Graph") } } } }
Last modified: 29 April 2025