Merge "NavController: disallow setting ViewmodelStore after setGraph" into androidx-master-dev
diff --git a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavBackStackEntry.java b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavBackStackEntry.java
index 8a071ab..fe52979 100644
--- a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavBackStackEntry.java
+++ b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavBackStackEntry.java
@@ -106,10 +106,6 @@
return mArgs;
}
- void setNavControllerViewModel(@NonNull NavControllerViewModel navControllerViewModel) {
- mNavControllerViewModel = navControllerViewModel;
- }
-
/**
* {@inheritDoc}
* <p>
diff --git a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.java b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.java
index 228cc354..8a5ba6a 100644
--- a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.java
+++ b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.java
@@ -1114,12 +1114,10 @@
}
void setViewModelStore(@NonNull ViewModelStore viewModelStore) {
- mViewModel = NavControllerViewModel.getInstance(viewModelStore);
- // Ensure that all of the NavBackStackEntry instances are using the
- // newly set NavControllerViewModel as their backing store.
- for (NavBackStackEntry entry : mBackStack) {
- entry.setNavControllerViewModel(mViewModel);
+ if (!mBackStack.isEmpty()) {
+ throw new IllegalStateException("ViewModelStore should be set before setGraph call");
}
+ mViewModel = NavControllerViewModel.getInstance(viewModelStore);
}
/**
diff --git a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavHostController.java b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavHostController.java
index eb879bb..d04da83 100644
--- a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavHostController.java
+++ b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavHostController.java
@@ -100,8 +100,13 @@
* Sets the host's ViewModelStore used by the NavController to store ViewModels at the
* navigation graph level. This is required to call {@link #getViewModelStoreOwner} and
* should generally be called for you by your {@link NavHost}.
+ * <p>
+ * You must call this method before {@link #setGraph(int)} or similar methods, because the
+ * {@link ViewModelStore} set here will be used by the created {@link NavBackStackEntry} items.
*
* @param viewModelStore ViewModelStore used to store ViewModels at the navigation graph level
+ * @throws IllegalStateException if this method is called when graph was already set via
+ * {@link #setGraph(int)} or similar methods.
*/
@Override
public void setViewModelStore(@NonNull ViewModelStore viewModelStore) {