Retrofit StateFlow ViewModel

使用前面文章retrofit、stateFlow、viewModel、lifecycleScope、viewModelScope

將MutableStateFlow的類型改為ArticleList。

在viewModelScope協程,呼叫網路連線。

1
2
3
4
5
6
7
8
9
10
class ArticleViewModel : ViewModel() {
  val _articleList = MutableStateFlow<ArticleList?>(null)
  val articleList: StateFlow<ArticleList?> = _articleList
  fun getArticleList() {
    viewModelScope.launch {
      val result = ArticleApi.retrofit.articleList()
      _articleList.value = result
    }
  }
}

Activity呼叫viewModel.getArticleList()。
lifecycleScope中viewModel._articleList.collect()收集接收網路回傳的資料。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class MainActivity09 : AppCompatActivity() {
  private val viewModel by viewModels<ArticleViewModel>()
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    val submit = findViewById<Button>(R.id.button)
    val textv = findViewById<TextView>(R.id.textView)
    lifecycleScope.launch {
      viewModel._articleList.collect { value ->
        textv.text = value.toString()
      }
    }
    submit.setOnClickListener {
      viewModel.getArticleList()
    }
  }
}

Activity不直接面對Retrofit的網路連線,由ViewModel去面對Retrofit的網路連線,Activity只跟ViewModel溝通。

ViewModel處理網路資料的接收,與收到資料後,就發射資料,而Activity會使用collect()監視並接收ViewModel傳來的資料。

  • viewModel.getArticleList()
  • viewModel._articleList.collect()

results matching ""

    No results matching ""