Search code examples
javaandroidmvvmviewmodel

SavedState ViewModel Using SavedStateViewModelFactory


I am following this codelab from google but it fails to saved the data. Here is the link

https://codelabs.developers.google.com/codelabs/android-lifecycles/#6

Activity Class

public class SavedStateActivity extends AppCompatActivity {

    private SavedStateViewModel mSavedStateViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.saved_state_activity);

        // Obtain the ViewModel
        // mSavedStateViewModel = new ViewModelProvider(this).get(SavedStateViewModel.class);
        mSavedStateViewModel = new ViewModelProvider(this,new SavedStateViewModelFactory(getApplication(),this)).get(SavedStateViewModel.class);

        // Show the ViewModel property's value in a TextView
        mSavedStateViewModel.getName().observe(this, new Observer<String>() {
            @Override
            public void onChanged(String savedString) {
                ((TextView)findViewById(R.id.saved_vm_tv))
                        .setText(getString(R.string.saved_in_vm, savedString));

            }
        });

        // Save button
        findViewById(R.id.save_bt).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                String newName = ((EditText)findViewById(R.id.name_et)).getText().toString();
                mSavedStateViewModel.saveNewName(newName);

            }
        });
    }
}

viewmodel class

public class SavedStateViewModel extends ViewModel {

    private static final String NAME_KEY = "name";

    private SavedStateHandle mState;

    public SavedStateViewModel(SavedStateHandle savedStateHandle) {
        mState = savedStateHandle;
    }

    // Expose an immutable LiveData
    LiveData<String> getName() {
        // getLiveData obtains an object that is associated with the key wrapped in a LiveData
        // so it can be observed for changes.
        return mState.getLiveData(NAME_KEY);
    }

    void saveNewName(String newName) {
        // Sets a new value for the object associated to the key. There's no need to set it
        // as a LiveData.
        mState.set(NAME_KEY, newName);
    }
}

As you can see I already add the SavedStateViewModelFactory at mSavedStateViewModel = new ViewModelProvider(this,new SavedStateViewModelFactory(getApplication(),this)).get(SavedStateViewModel.class);

But nothing work when I destroyed the app and open it back the data still not persist.


Solution

  • The solution still in beta for the saved state said by Google. The only solution, for now, to persist the data is using Room.