Thandeka Zulu
Thandeka Zulu

Reputation: 1

Age from one fragment extracted using edit text saved in datastore not showing in another fragment using text view in kotlin android studio

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

Answers (0)

Related Questions