Reputation: 1
I am using edit text to get username and age from one fragment. These details are saved in Datastore class in kotlin. When I want to display username and age to the next fragment. It is only the username that is visible, the age is not displayed. In the main activity I ensure that if username and age is not entered, the user will go through the onboarding fragments namely GetStarted and UserDetails. However if the user has already entered username and age, then there is no need for them to register. They are navigated to the dashboard fragment.
Datastore class
private val Context.dataStore by preferencesDataStore(name = "user_prefs")
class UserPreferences(context: Context) {
private val dataStore = context.dataStore
companion object {
val USERNAME_KEY = stringPreferencesKey("username")
val AGE_KEY = intPreferencesKey("age")
}
val usernameFlow: Flow<String?> = dataStore.data.map { preferences ->
preferences[USERNAME_KEY]
}
val ageFlow: Flow<Int?> = dataStore.data.map { preferences ->
preferences[AGE_KEY]
}
suspend fun saveUserDetails(username: String, age: Int) {
dataStore.edit { preferences ->
preferences[USERNAME_KEY] = username
preferences[AGE_KEY] = age
}
}
}
Get started fragment
class GetStartedFragment : Fragment() {
private var _binding: FragmentGetStartedBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentGetStartedBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.btnGetStarted.setOnClickListener {
findNavController().navigate(R.id.action_getStartedFragment_to_userDetailsFragment)
}
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}
User details fragment
class UserDetailsFragment : Fragment() {
private var _binding: FragmentUserDetailsBinding? = null
private val binding get() = _binding!!
private lateinit var userPreferences: UserPreferences
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentUserDetailsBinding.inflate(inflater, container, false)
userPreferences = UserPreferences(requireContext())
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.btnSave.setOnClickListener {
val username = binding.etUsername.text.toString()
val ageStr = binding.etAge.text.toString()
if (username.isBlank()) {
Snackbar.make(binding.root, "Please enter a valid username", Snackbar.LENGTH_SHORT).show()
return@setOnClickListener
}
val age = ageStr.toIntOrNull()
if (age == null || age < 0) {
Snackbar.make(binding.root, "Please enter a valid age", Snackbar.LENGTH_SHORT).show()
return@setOnClickListener
}
Log.d("SaveAgeFragment", "Saving age: $age")
lifecycleScope.launch {
userPreferences.saveUserDetails(username, age)
findNavController().navigate(R.id.action_userDetailsFragment_to_dashboardFragment)
}
}
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}
Dashboard fragment
class DashboardFragment : Fragment() {
private var _binding: FragmentDashboardBinding? = null
private val binding get() = _binding!!
private lateinit var userPreferences: UserPreferences
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentDashboardBinding.inflate(inflater, container, false)
userPreferences = UserPreferences(requireContext())
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
lifecycleScope.launch {
userPreferences.usernameFlow.collect { username ->
binding.tvUsername.text = "$username"
}
userPreferences.ageFlow.collect { age ->
binding.tvAges.text = "$age"
}
}
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}
Upvotes: 0
Views: 17