Use kotlin flow (welcome activity)

This commit is contained in:
Super12138 2024-09-07 16:54:30 +08:00
parent 007668fa97
commit 7974a92c69
6 changed files with 70 additions and 51 deletions

View file

@ -53,7 +53,8 @@ class ToDoViewModel : ViewModel() {
fun updateTask(position: Int, todo: ToDoRoom) { fun updateTask(position: Int, todo: ToDoRoom) {
todoList.removeAt(position) todoList.removeAt(position)
todoList.add( todoList.add(
position, ToDo( position,
ToDo(
todo.uuid, todo.uuid,
todo.state, todo.state,
todo.content, todo.content,

View file

@ -1,6 +1,5 @@
package cn.super12138.todo.views.welcome package cn.super12138.todo.views.welcome
import android.annotation.SuppressLint
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import androidx.activity.OnBackPressedCallback import androidx.activity.OnBackPressedCallback
@ -8,7 +7,9 @@ import androidx.activity.viewModels
import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.content.res.AppCompatResources
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.commit import androidx.fragment.app.commit
import androidx.lifecycle.Observer import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import cn.super12138.todo.R import cn.super12138.todo.R
import cn.super12138.todo.constant.GlobalValues import cn.super12138.todo.constant.GlobalValues
import cn.super12138.todo.databinding.ActivityWelcomeBinding import cn.super12138.todo.databinding.ActivityWelcomeBinding
@ -20,11 +21,11 @@ import cn.super12138.todo.views.welcome.pages.IntroPage
import cn.super12138.todo.views.welcome.pages.ProgressPage import cn.super12138.todo.views.welcome.pages.ProgressPage
import cn.super12138.todo.views.welcome.pages.ToDoBtnPage import cn.super12138.todo.views.welcome.pages.ToDoBtnPage
import cn.super12138.todo.views.welcome.pages.ToDoItemPage import cn.super12138.todo.views.welcome.pages.ToDoItemPage
import kotlinx.coroutines.launch
class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>() { class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>() {
private val viewModel by viewModels<WelcomeViewModel>() private val viewModel by viewModels<WelcomeViewModel>()
@SuppressLint("ClickableViewAccessibility")
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -47,7 +48,7 @@ class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>() {
val intent = Intent(this, MainActivity::class.java) val intent = Intent(this, MainActivity::class.java)
startActivity(intent) startActivity(intent)
} else { } else {
currentPage.value = 1 viewModel.setCurrentPage(1)
nextPage(1) nextPage(1)
} }
} }
@ -57,58 +58,62 @@ class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>() {
supportFragmentManager.popBackStack() supportFragmentManager.popBackStack()
currentPage.value = currentPage.value?.minus(1) viewModel.decreasePage()
} }
nextBtn.setOnIntervalClickListener { nextBtn.setOnIntervalClickListener {
VibrationUtils.performHapticFeedback(it) VibrationUtils.performHapticFeedback(it)
nextPage(currentPage.value!!.plus(1)) nextPage(currentPage.value + 1)
currentPage.value = currentPage.value?.plus(1) viewModel.increasePage()
} }
currentPage.observe(this, Observer { page -> lifecycleScope.launch {
when (page) { repeatOnLifecycle(Lifecycle.State.STARTED) {
0 -> { viewModel.currentPage.collect { page ->
centerBtn.apply { when (page) {
text = getString(R.string.start) 0 -> {
icon = AppCompatResources.getDrawable( centerBtn.apply {
this@WelcomeActivity, text = getString(R.string.start)
R.drawable.ic_arrow_forward icon = AppCompatResources.getDrawable(
) this@WelcomeActivity,
show() R.drawable.ic_arrow_forward
)
show()
}
nextBtn.hide()
previousBtn.hide()
}
in 1..2 -> {
centerBtn.hide()
previousBtn.show()
nextBtn.show()
}
3 -> {
centerBtn.apply {
text = getString(R.string.enter_app)
icon = AppCompatResources.getDrawable(
this@WelcomeActivity,
R.drawable.ic_focus
)
show()
}
previousBtn.show()
nextBtn.hide()
}
else -> {
if (page > 3) viewModel.setCurrentPage(3)
if (page < 0) viewModel.setCurrentPage(0)
}
} }
nextBtn.hide()
previousBtn.hide()
}
in 1..2 -> {
centerBtn.hide()
previousBtn.show()
nextBtn.show()
}
3 -> {
centerBtn.apply {
text = getString(R.string.enter_app)
icon = AppCompatResources.getDrawable(
this@WelcomeActivity,
R.drawable.ic_focus
)
show()
}
previousBtn.show()
nextBtn.hide()
}
else -> {
if (page > 3) currentPage.value = 3
if (page < 0) currentPage.value = 0
} }
} }
}) }
onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() { override fun handleOnBackPressed() {
@ -116,7 +121,7 @@ class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>() {
finish() finish()
} else { } else {
supportFragmentManager.popBackStack() supportFragmentManager.popBackStack()
currentPage.value = currentPage.value?.minus(1) viewModel.decreasePage()
} }
} }
}) })

View file

@ -1,8 +1,22 @@
package cn.super12138.todo.views.welcome package cn.super12138.todo.views.welcome
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
class WelcomeViewModel : ViewModel() { class WelcomeViewModel : ViewModel() {
val currentPage = MutableLiveData<Int>(0) private val _currentPage = MutableStateFlow(0)
val currentPage = _currentPage.asStateFlow()
fun setCurrentPage(page: Int) {
_currentPage.value = page
}
fun increasePage() {
_currentPage.value += 1
}
fun decreasePage() {
_currentPage.value -= 1
}
} }

View file

@ -1,7 +1,6 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="70dp" android:width="70dp"
android:height="70dp" android:height="70dp"
android:tint="?android:attr/textColorPrimary"
android:viewportWidth="24" android:viewportWidth="24"
android:viewportHeight="24"> android:viewportHeight="24">
<path <path

View file

@ -48,7 +48,6 @@
<item name="colorSurfaceContainerHigh">@color/md_theme_surfaceContainerHigh</item> <item name="colorSurfaceContainerHigh">@color/md_theme_surfaceContainerHigh</item>
<item name="colorSurfaceContainerHighest">@color/md_theme_surfaceContainerHighest</item> <item name="colorSurfaceContainerHighest">@color/md_theme_surfaceContainerHighest</item>
<item name="android:textColorHighlight">@color/md_theme_secondary</item> <item name="android:textColorHighlight">@color/md_theme_secondary</item>
<item name="preferenceTheme">@style/AppPreferenceThemeOverlay</item> <item name="preferenceTheme">@style/AppPreferenceThemeOverlay</item>
<item name="alertDialogTheme">@style/ToDo.M3AlertDialog</item> <item name="alertDialogTheme">@style/ToDo.M3AlertDialog</item>

View file

@ -54,6 +54,7 @@
</style> </style>
<style name="Theme.ToDo" parent="Base.Theme.ToDo"> <style name="Theme.ToDo" parent="Base.Theme.ToDo">
<!-- 透明状态栏 -->
<item name="android:navigationBarColor">@android:color/transparent</item> <item name="android:navigationBarColor">@android:color/transparent</item>
<item name="android:windowTranslucentNavigation">true</item> <item name="android:windowTranslucentNavigation">true</item>
<item name="android:statusBarColor">@android:color/transparent</item> <item name="android:statusBarColor">@android:color/transparent</item>