当前位置: 首页> 游戏> 网游 > h5页面制作app_东莞常平中学_网络舆情监测专业_专业营销团队公司

h5页面制作app_东莞常平中学_网络舆情监测专业_专业营销团队公司

时间:2025/8/12 18:00:13来源:https://blog.csdn.net/ljt2724960661/article/details/146436001 浏览次数:1次
h5页面制作app_东莞常平中学_网络舆情监测专业_专业营销团队公司

         这一节主要了解一下Compose中hilt-navigation-compose,hilt-navigation-compose 是一个用于在 Jetpack Compose应用里结合Hilt(依赖注入框架)和Jetpack Navigation Compose(导航库)的库。它简化了在导航过程中进行依赖注入的操作,使你能在导航目标(如Composable函数)中轻松地进行依赖注入。

场景:
在导航目标中注入依赖:当你在导航到某个 Composable 函数时,需要注入一些依赖(像 ViewModel、Repository 等),该库能让这个过程更简单。
模块化开发:在大型应用中,采用模块化开发时,不同模块的导航目标可能需要依赖注入,hilt-navigation-compose 可以帮助管理这些依赖。

栗子:
App下Gradle依赖:

plugins {...kotlin("kapt")id("dagger.hilt.android.plugin")
}dependencies {implementation("com.google.dagger:hilt-android:2.48.1")kapt("com.google.dagger:hilt-android-compiler:2.48.1")implementation ("androidx.navigation:navigation-compose:2.5.3")implementation ("androidx.hilt:hilt-navigation-compose:1.0.0")}

项目下gradle:

buildscript {dependencies {classpath("com.google.dagger:hilt-android-gradle-plugin:2.44")}
}
import android.app.Application
import dagger.hilt.android.HiltAndroidApp@HiltAndroidApp
class MyApplication:Application()
import javax.inject.Injectclass UserRepository @Inject constructor(){fun getUserData(userId: String): String = "User data for $userId"
}
import androidx.lifecycle.ViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject@HiltViewModel
class MainViewModel @Inject constructor() : ViewModel() {fun getWelcomeMessage(): String = "Welcome to the app!"
}

import androidx.lifecycle.ViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject@HiltViewModel
class UserDetailViewModel @Inject constructor(private val userRepository: UserRepository
) : ViewModel() {fun getUserData(userId: String): String {return userRepository.getUserData(userId)}
}

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material.Button
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Surface
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import androidx.navigation.navArgument
import androidx.navigation.navigation
import dagger.hilt.android.AndroidEntryPoint@AndroidEntryPoint
class MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {MaterialTheme {Surface(modifier = Modifier.fillMaxSize()) {val navController = rememberNavController()NavHost(navController = navController,startDestination = "main_screen") {mainGraph(navController)}}}}}
}fun NavGraphBuilder.mainGraph(navController: NavHostController) {composable("main_screen") {MainScreen(navController)}navigation(startDestination = "user_list",route = "user_graph") {composable("/user_graph/user_list") {UserListScreen(navController)}composable("/user_graph/user_detail/{userId}",arguments = listOf(navArgument("userId") { defaultValue = "defaultId" })) { backStackEntry ->val userId = backStackEntry.arguments?.getString("userId") ?: "defaultId"UserDetailScreen(userId)}}
}@Composable
fun MainScreen(navController: NavHostController) {val viewModel: MainViewModel = hiltViewModel()Column(modifier = Modifier.fillMaxSize(),verticalArrangement = Arrangement.Center,horizontalAlignment = Alignment.CenterHorizontally) {Text(text = viewModel.getWelcomeMessage())Button(onClick = { navController.navigate("/user_graph/user_list") }) {Text("Go to User List")}}
}@Composable
fun UserListScreen(navController: NavHostController) {Column(modifier = Modifier.fillMaxSize(),verticalArrangement = Arrangement.Center,horizontalAlignment = Alignment.CenterHorizontally) {Text("User List")Button(onClick = { navController.navigate("/user_graph/user_detail/123") }) {Text("Go to User Detail")}}
}@Composable
fun UserDetailScreen(userId: String) {val viewModel: UserDetailViewModel = hiltViewModel()Column(modifier = Modifier.fillMaxSize(),verticalArrangement = Arrangement.Center,horizontalAlignment = Alignment.CenterHorizontally) {Text(text = viewModel.getUserData(userId))}
}

优缺点:
优点
1简化依赖注入 自动管理ViewModel依赖,借助hilt-navigation-compose提供的hiltViewModel函数,能在Compose导航目标界面轻松获取由Hilt注入依赖的ViewModel。开发者无需手动处理ViewModel的创建和依赖注入逻辑,降低了代码的复杂度。例如在开发一个包含多个界面的应用时,每个界面的ViewModel可能依赖不同的仓库类,使用该库后,只需在ViewModel构造函数中声明依赖,就能自动完成注入。
2. 提高代码可维护性 明确的依赖关系,Hilt的依赖注入机制使得依赖关系在代码中更加清晰明确。每个ViewModel所需的依赖通过构造函数注入,方便开发者理解和维护代码。例如,在查看一个ViewModel时,能直接从构造函数了解到它依赖哪些类。
缺点
1 学习成本较高,注解系统和组件概念相对复杂.
2 增加编译时间,注解处理开销,Hilt的注解处理器在编译时会扫描代码并生成大量辅助代码,这会增加编译时间。尤其是在项目规模较大时,编译时间的增加会比较明显,影响开发效率。

注意:

1 依赖版本兼容性,Hilt Compose Navigation和hilt-navigation-compose版本要保证这些库的版本相互兼容。不同版本的库可能存在API差异或者不兼容问题,可能导致编译错误或者运行时异常。例如hilt-navigation-compose不同版本可能依赖于特定版本的Hilt和Compose Navigation,一般建议参考官方文档来选择合适的版本组合。
2 避免在 ViewModel中注入Android特定的上下文,虽然 Hilt可以注入Application上下文,但尽量避免在 ViewModel中直接使用Activity或Fragment上下文,因为ViewModel的生命周期与Activity或Fragment不同,可能会导致内存泄漏。

关键字:h5页面制作app_东莞常平中学_网络舆情监测专业_专业营销团队公司

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: