LiveData + ViewModel Состояния, значения cla sh и наблюдается только последнее значение - PullRequest
1 голос
/ 23 апреля 2020

Я использую ViewModel с состояниями и LiveData с одним наблюдателем. У меня есть активность и фрагмент. все работает нормально, пока я не поворачиваю экран, а затем состояния, которые я хочу наблюдать, cla sh. Что я могу сделать, чтобы предотвратить это и заставить это работать как ожидалось? Я знаю, что могу добавить больше наблюдателей, но я не хочу решать это таким образом, это может привести к проблемам с другим кодом.

Код MainActivity:

    private var appsDetailsHmap = HashMap< String , AppsDetails>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        progressBar = CircleProgressBarDialog(this)


        viewModel.getState().observe(this, Observer {state->
            when(state){
                is SettingsViewModelStates.GetAppsDetails->initUI(state.list)
                is SettingsViewModelStates.ShowDialog->progressBar.showOrHide(state.visibility)
                is SettingsViewModelStates.GetCachedData->setCachedSettings(state.appDetailsHmap,state.selectedApp,state.speechResultAppName)
            }
        })

        if (savedInstanceState==null){
            viewModel.initSettingsActivityUI(appsDetailsHmap)
        }
        else{
            viewModel.initCachedSettingsActivityUI()
        }

Код фрагмента


    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        val view= inflater.inflate(R.layout.fragment_added_apps, container, false)

        viewModel.getCachedApplist()

        return view
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        viewModel.getState().observe(viewLifecycleOwner, Observer {state->
            when(state){
                is SettingsViewModelStates.PassAppsToFragment->{
                    initRecyclerView(state.list)
                }
            }
        })
    }

ViewModel


     private var state=MutableLiveData<SettingsViewModelStates>()
     private var appsDetailsHmap=HashMap<String,AppsDetails>()
     private var addedApps= HashMap<String,Drawable?>()

     fun getState()=state as LiveData<SettingsViewModelStates>

     fun getCachedApplist(){
        if (addedApps.isEmpty()){
            getAppsList()
            println("empty")
        }
        else
            state.setValue(SettingsViewModelStates.PassAppsToFragment(addedApps))
    }

    fun initCachedSettingsActivityUI(){
        state.setValue(SettingsViewModelStates.GetCachedData(appsDetailsHmap,selectedApp,speechResultAppName))
    }

    fun initSettingsActivityUI(list:HashMap<String, AppsDetails>) {
        appsDetailsHmap=list
        state.setValue( SettingsViewModelStates.GetAppsDetails(list))
    }

состояния:


    sealed class SettingsViewModelStates {

    data class GetAppsDetails(val list:HashMap<String, AppsDetails>):SettingsViewModelStates()
    data class ShowDialog(val visibility: Int) : SettingsViewModelStates()
    data class PassAppsToFragment(val list:HashMap<String,Drawable?>) : SettingsViewModelStates()
    data class GetCachedData(val appDetailsHmap:HashMap<String,AppsDetails>,
                             val selectedApp: AppsDetails,
                             val speechResultAppName:String ) : SettingsViewModelStates()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...