@@ -134,14 +134,10 @@ public struct NavigationStack : View, Renderable {
134134
135135 #if SKIP
136136 @Composable public override func Render( context: ComposeContext ) {
137- // Have to use rememberSaveable for e.g. a nav stack in each tab
138- let destinations = rememberSaveable ( stateSaver: context. stateSaver as! Saver < Preference < NavigationDestinations > , Any > ) { mutableStateOf ( Preference < NavigationDestinations > ( key: NavigationDestinationsPreferenceKey . self) )
139- }
140- // Make this collector non-erasable so that destinations defined at e.g. the root nav stack layer don't disappear when you push
141- let destinationsCollector = PreferenceCollector < NavigationDestinations > ( key: NavigationDestinationsPreferenceKey . self, state: destinations, isErasable: false )
142- let destinationLayoutHints = rememberSaveable ( stateSaver: context. stateSaver as! Saver < Preference < NavigationDestinationLayoutHintsMap > , Any > ) { mutableStateOf ( Preference < NavigationDestinationLayoutHintsMap > ( key: NavigationDestinationLayoutHintsPreferenceKey . self) )
143- }
144- let destinationLayoutHintsCollector = PreferenceCollector < NavigationDestinationLayoutHintsMap > ( key: NavigationDestinationLayoutHintsPreferenceKey . self, state: destinationLayoutHints, isErasable: false )
137+ // Have to use rememberSaveable for e.g. a nav stack in each tab. Make the collectors non-erasable so that
138+ // destinations defined at e.g. the root nav stack layer don't disappear when you push.
139+ let ( destinations, destinationsCollector) = rememberSaveablePreferenceCollector ( key: NavigationDestinationsPreferenceKey . self, stateSaver: context. stateSaver as! Saver < Preference < NavigationDestinations > , Any > , isErasable: false )
140+ let ( destinationLayoutHints, destinationLayoutHintsCollector) = rememberSaveablePreferenceCollector ( key: NavigationDestinationLayoutHintsPreferenceKey . self, stateSaver: context. stateSaver as! Saver < Preference < NavigationDestinationLayoutHintsMap > , Any > , isErasable: false )
145141 let reducedDestinations = destinations. value. reduced
146142 let reducedDestinationLayoutHints = destinationLayoutHints. value. reduced
147143 let mergedDestinations = mergeNavigationDestinationsWithLayoutHints ( reducedDestinations, layoutHints: reducedDestinationLayoutHints)
@@ -166,12 +162,9 @@ public struct NavigationStack : View, Renderable {
166162 }
167163 // These preferences are per-entry, but if we put them in RenderEntry then their initial values don't show
168164 // during the navigation animation. We have to collect them here
169- let title = rememberSaveable ( stateSaver: state. stateSaver as! Saver < Preference < Text > , Any > ) { mutableStateOf ( Preference < Text > ( key: NavigationTitlePreferenceKey . self) ) }
170- let titleCollector = PreferenceCollector < Text > ( key: NavigationTitlePreferenceKey . self, state: title)
171- let toolbarPreferences = rememberSaveable ( stateSaver: state. stateSaver as! Saver < Preference < ToolbarPreferences > , Any > ) { mutableStateOf ( Preference < ToolbarPreferences > ( key: ToolbarPreferenceKey . self) ) }
172- let toolbarPreferencesCollector = PreferenceCollector < ToolbarPreferences > ( key: ToolbarPreferenceKey . self, state: toolbarPreferences)
173- let toolbarContentPreferences = rememberSaveable ( stateSaver: state. stateSaver as! Saver < Preference < ToolbarContentPreferences > , Any > ) { mutableStateOf ( Preference < ToolbarContentPreferences > ( key: ToolbarContentPreferenceKey . self) ) }
174- let toolbarContentPreferencesCollector = PreferenceCollector < ToolbarContentPreferences > ( key: ToolbarContentPreferenceKey . self, state: toolbarContentPreferences)
165+ let ( title, titleCollector) = rememberSaveablePreferenceCollector ( key: NavigationTitlePreferenceKey . self, stateSaver: state. stateSaver as! Saver < Preference < Text > , Any > )
166+ let ( toolbarPreferences, toolbarPreferencesCollector) = rememberSaveablePreferenceCollector ( key: ToolbarPreferenceKey . self, stateSaver: state. stateSaver as! Saver < Preference < ToolbarPreferences > , Any > )
167+ let ( toolbarContentPreferences, toolbarContentPreferencesCollector) = rememberSaveablePreferenceCollector ( key: ToolbarContentPreferenceKey . self, stateSaver: state. stateSaver as! Saver < Preference < ToolbarContentPreferences > , Any > )
175168 let arguments = NavigationEntryArguments ( isRoot: true , state: state, safeArea: safeArea, ignoresSafeAreaEdges: ignoresSafeAreaEdges, title: title. value. reduced, toolbarPreferences: toolbarPreferences. value. reduced)
176169 PreferenceValues . shared. collectPreferences ( [ titleCollector, toolbarPreferencesCollector, toolbarContentPreferencesCollector, destinationsCollector, destinationLayoutHintsCollector] ) {
177170 RenderEntry ( navigator: navigator, toolbarContent: toolbarContentPreferences, arguments: arguments, context: context) { context in
@@ -185,12 +178,9 @@ public struct NavigationStack : View, Renderable {
185178 }
186179 // These preferences are per-entry, but if we put them in RenderEntry then their initial values don't show
187180 // during the navigation animation. We have to collect them here
188- let title = rememberSaveable ( stateSaver: state. stateSaver as! Saver < Preference < Text > , Any > ) { mutableStateOf ( Preference < Text > ( key: NavigationTitlePreferenceKey . self) ) }
189- let titleCollector = PreferenceCollector < Text > ( key: NavigationTitlePreferenceKey . self, state: title)
190- let toolbarPreferences = rememberSaveable ( stateSaver: state. stateSaver as! Saver < Preference < ToolbarPreferences > , Any > ) { mutableStateOf ( Preference < ToolbarPreferences > ( key: ToolbarPreferenceKey . self) ) }
191- let toolbarPreferencesCollector = PreferenceCollector < ToolbarPreferences > ( key: ToolbarPreferenceKey . self, state: toolbarPreferences)
192- let toolbarContentPreferences = rememberSaveable ( stateSaver: state. stateSaver as! Saver < Preference < ToolbarContentPreferences > , Any > ) { mutableStateOf ( Preference < ToolbarContentPreferences > ( key: ToolbarContentPreferenceKey . self) ) }
193- let toolbarContentPreferencesCollector = PreferenceCollector < ToolbarContentPreferences > ( key: ToolbarContentPreferenceKey . self, state: toolbarContentPreferences)
181+ let ( title, titleCollector) = rememberSaveablePreferenceCollector ( key: NavigationTitlePreferenceKey . self, stateSaver: state. stateSaver as! Saver < Preference < Text > , Any > )
182+ let ( toolbarPreferences, toolbarPreferencesCollector) = rememberSaveablePreferenceCollector ( key: ToolbarPreferenceKey . self, stateSaver: state. stateSaver as! Saver < Preference < ToolbarPreferences > , Any > )
183+ let ( toolbarContentPreferences, toolbarContentPreferencesCollector) = rememberSaveablePreferenceCollector ( key: ToolbarContentPreferenceKey . self, stateSaver: state. stateSaver as! Saver < Preference < ToolbarContentPreferences > , Any > )
194184 EnvironmentValues . shared. setValues {
195185 $0. setdismiss ( DismissAction ( action: { navigator. value. navigateBack ( ) } ) )
196186 return ComposeResult . ok
@@ -266,11 +256,9 @@ public struct NavigationStack : View, Renderable {
266256 let searchFieldOffsetPx = rememberSaveable ( stateSaver: context. stateSaver as! Saver < Float , Any > ) { mutableStateOf ( Float ( 0.0 ) ) }
267257 let searchFieldScrollConnection = remember { SearchFieldScrollConnection ( heightPx: searchFieldHeightPx, offsetPx: searchFieldOffsetPx) }
268258
269- let searchableStatePreference = rememberSaveable ( stateSaver: context. stateSaver as! Saver < Preference < SearchableState ? > , Any > ) { mutableStateOf ( Preference < SearchableState ? > ( key: SearchableStatePreferenceKey . self) ) }
270- let searchableStateCollector = PreferenceCollector < SearchableState ? > ( key: SearchableStatePreferenceKey . self, state: searchableStatePreference)
259+ let ( searchableStatePreference, searchableStateCollector) = rememberSaveablePreferenceCollector ( key: SearchableStatePreferenceKey . self, stateSaver: context. stateSaver as! Saver < Preference < SearchableState ? > , Any > )
271260
272- let scrollToTop = rememberSaveable ( stateSaver: context. stateSaver as! Saver < Preference < ScrollToTopAction > , Any > ) { mutableStateOf ( Preference < ScrollToTopAction > ( key: ScrollToTopPreferenceKey . self) ) }
273- let scrollToTopCollector = PreferenceCollector < ScrollToTopAction > ( key: ScrollToTopPreferenceKey . self, state: scrollToTop)
261+ let ( scrollToTop, scrollToTopCollector) = rememberSaveablePreferenceCollector ( key: ScrollToTopPreferenceKey . self, stateSaver: context. stateSaver as! Saver < Preference < ScrollToTopAction > , Any > )
274262
275263 let initialScrollBehavior = isInlineTitleDisplayMode ? TopAppBarDefaults . pinnedScrollBehavior ( ) : TopAppBarDefaults . exitUntilCollapsedScrollBehavior ( )
276264 // Determine the final scrollBehavior early by checking if the environment value would modify it
0 commit comments