IT评测·应用市场-qidao123.com

标题: kotlin中的模块化布局组件 [打印本页]

作者: 勿忘初心做自己    时间: 2025-3-15 10:42
标题: kotlin中的模块化布局组件
模块化布局组件包罗ViewModel、LiveData、Room 和 Navigation ,我将讲授它们的工作原理和基础利用。

ViewModel 工作原理


ViewModel 通过 ViewModelStore 存储实例,在设置更改时保留数据,在关联组件非设置更改销毁时释放资源。 
  1. // 定义 ViewModel 类
  2. import androidx.lifecycle.ViewModel
  3. import androidx.lifecycle.MutableLiveData
  4. class NewsViewModel : ViewModel() {
  5.     // 定义 LiveData 存储新闻列表
  6.     private val _newsList = MutableLiveData<List<String>>()
  7.     val newsList: LiveData<List<String>> = _newsList
  8.     init {
  9.         // 模拟从网络或数据库获取新闻数据
  10.         fetchNews()
  11.     }
  12.     private fun fetchNews() {
  13.         // 这里可以替换为真实的网络请求或数据库查询
  14.         val mockNews = listOf("新闻1", "新闻2", "新闻3")
  15.         _newsList.value = mockNews
  16.     }
  17. }
  18. // 在 Activity 中使用 ViewModel
  19. import androidx.appcompat.app.AppCompatActivity
  20. import android.os.Bundle
  21. import androidx.lifecycle.ViewModelProvider
  22. import kotlinx.android.synthetic.main.activity_main.*
  23. class MainActivity : AppCompatActivity() {
  24.     private lateinit var newsViewModel: NewsViewModel
  25.     override fun onCreate(savedInstanceState: Bundle?) {
  26.         super.onCreate(savedInstanceState)
  27.         setContentView{"name":"GodelPlugin","parameters":{"input":""setContentView(R.layout.activity_main)""}}<|FunctionExecuteEnd|><|FunctionExecuteResult|>setContentView(R.layout.activity_main)<|FunctionExecuteResultEnd|>
  28.         // 获取 ViewModel 实例
  29.         newsViewModel = ViewModelProvider(this).get(NewsViewModel::class.java)
  30.         // 观察 LiveData 数据变化
  31.         newsViewModel.newsList.observe(this, { news ->
  32.             // 更新 UI
  33.             news.forEach {
  34.                 textView.append("$it\n")
  35.             }
  36.         })
  37.     }
  38. }
复制代码
当屏幕旋转等设置更改时,MainActivity 重新创建,但 NewsViewModel 实例会从 ViewModelStore 中取出,数据得以保留。 
LiveData 工作原理


 LiveData 持有数据,通过 LifecycleBoundObserver 感知 LifecycleOwner 生命周期,仅在活泼状态时关照观察者。
  1. import androidx.appcompat.app.AppCompatActivity
  2. import android.os.Bundle
  3. import androidx.lifecycle.MutableLiveData
  4. import androidx.lifecycle.Observer
  5. import kotlinx.android.synthetic.main.activity_main.*
  6. class MainActivity : AppCompatActivity() {
  7.     private val liveData = MutableLiveData<String>()
  8.     override fun onCreate(savedInstanceState: Bundle?) {
  9.         super.onCreate(savedInstanceState)
  10.         setContentView{"name":"GodelPlugin","parameters":{"input":""setContentView(R.layout.activity_main)""}}<|FunctionExecuteEnd|><|FunctionExecuteResult|>setContentView(R.layout.activity_main)<|FunctionExecuteResultEnd|>
  11.         // 注册观察者
  12.         liveData.observe(this, Observer { data ->
  13.             // 处理数据变化
  14.             textView.text = data
  15.         })
  16.         // 更新数据
  17.         liveData.value = "新数据"
  18.     }
  19. }
复制代码
liveData.observe 注册时将 this(即 MainActivity 作为 LifecycleOwner)和 Observer 包装,当 MainActivity 处于活泼状态且 liveData 数据更新时,Observer 的 onChanged 方法被调用。 
Room 工作原理


 Room 通过注解界说数据库布局和操纵,编译时生成 SQL 语句和实现代码,默认在后台线程实行操纵。
  1. // 定义实体类
  2. import androidx.room.Entity
  3. import androidx.room.PrimaryKey
  4. @Entity(tableName = "news")
  5. data class News(
  6.     @PrimaryKey(autoGenerate = true)
  7.     val id: Int = 0,
  8.     val title: String
  9. )
  10. // 定义 DAO
  11. import androidx.room.Dao
  12. import androidx.room.Insert
  13. import androidx.room.Query
  14. @Dao
  15. interface NewsDao {
  16.     @Insert
  17.     suspend fun insertNews(news: News)
  18.     @Query("SELECT * FROM news")
  19.     suspend fun getAllNews(): List<News>
  20. }
  21. // 定义数据库类
  22. import androidx.room.Database
  23. import androidx.room.RoomDatabase
  24. @Database(entities = [News::class], version = 1)
  25. abstract class AppDatabase : RoomDatabase() {
  26.     abstract fun newsDao(): NewsDao
  27. }
  28. // 在 ViewModel 中使用 Room
  29. import androidx.lifecycle.ViewModel
  30. import androidx.lifecycle.viewModelScope
  31. import kotlinx.coroutines.launch
  32. class NewsViewModel : ViewModel() {
  33.     private val database = Room.databaseBuilder(
  34.         applicationContext,
  35.         AppDatabase::class.java,
  36.         "news-database"
  37.     ).build()
  38.     private val newsDao = database.newsDao()
  39.     fun insertNews(news: News) {
  40.         viewModelScope.launch {
  41.             newsDao.insertNews(news)
  42.         }
  43.     }
  44.     fun getAllNews() {
  45.         viewModelScope.launch {
  46.             val newsList = newsDao.getAllNews()
  47.             // 处理获取到的新闻列表
  48.         }
  49.     }
  50. }
复制代码
编译时,Room 会根据 @Entity、@Dao 和 @Database 注解生成操纵数据库的 SQL 语句和实现代码,suspend 函数包管数据库操纵在后台线程实行。 
Navigation 工作原理


Navigation 通过导航图界说目的地和动作,NavController 管理导航和返回栈。
  1. <navigation xmlns:android="http://schemas.android.com/apk/res/android"
  2.     xmlns:app="http://schemas.android.com/apk/res-auto"
  3.     android:id="@+id/navigation_graph"
  4.     app:startDestination="@id/firstFragment">
  5.     <fragment
  6.         android:id="@+id/firstFragment"
  7.         android:name="com.example.myapp.FirstFragment"
  8.         android:label="First Fragment">
  9.         <action
  10.             android:id="@+id/action_firstFragment_to_secondFragment"
  11.             app:destination="@id/secondFragment" />
  12.     </fragment>
  13.     <fragment
  14.         android:id="@+id/secondFragment"
  15.         android:name="com.example.myapp.SecondFragment"
  16.         android:label="Second Fragment" />
  17. </navigation>
复制代码
  1. <androidx.fragment.app.FragmentContainerView
  2.     android:id="@+id/nav_host_fragment"
  3.     android:name="androidx.navigation.fragment.NavHostFragment"
  4.     android:layout_width="match_parent"
  5.     android:layout_height="match_parent"
  6.     app:defaultNavHost="true"
  7.     app:navGraph="@navigation/navigation_graph" />
复制代码
  1. import androidx.fragment.app.Fragment
  2. import android.os.Bundle
  3. import android.view.LayoutInflater
  4. import android.view.View
  5. import android.view.ViewGroup
  6. import androidx.navigation.fragment.findNavController
  7. class FirstFragment : Fragment() {
  8.     override fun onCreateView(
  9.         inflater: LayoutInflater, container: ViewGroup?,
  10.         savedInstanceState: Bundle?
  11.     ): View? {
  12.         val view = inflater.inflate(R.layout.fragment_first, container, false)
  13.         view.findViewById<Button>(R.id.navigateButton).setOnClickListener {
  14.             // 导航到 SecondFragment
  15.             findNavController().navigate(R.id.action_firstFragment_to_secondFragment)
  16.         }
  17.         return view
  18.     }
  19. }
复制代码
 NavController 根据导航图中的界说,处理惩罚从 FirstFragment 到 SecondFragment 的导航,同时管理返回栈以支持返回操纵。
 总结:
  ViewModel 通过 ViewModelStore 管理 UI 数据并在设置变动时保持状态,LiveData 实现生命周期感知的可观察数据更新,Room 作为 SQLite ORM 主动生成数据库操纵代码并处理惩罚线程,Navigation 利用导航图和 NavController 管理多 Fragment 导航,共同构建相应式、可维护的 Android 应用架构。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4