mirror of
https://github.com/zhigang1992/react-navigation.git
synced 2026-06-16 21:21:27 +08:00
fix: pass rehydrated state in onStateChange and devtools
This commit is contained in:
@@ -137,9 +137,9 @@ const Container = React.forwardRef(function NavigationContainer(
|
||||
[trackAction]
|
||||
);
|
||||
|
||||
const getRootState = () => {
|
||||
const getRootState = React.useCallback(() => {
|
||||
return getStateForRoute('root');
|
||||
};
|
||||
}, [getStateForRoute]);
|
||||
|
||||
React.useImperativeHandle(ref, () => ({
|
||||
...(Object.keys(CommonActions) as Array<keyof typeof CommonActions>).reduce<
|
||||
@@ -220,18 +220,18 @@ const Container = React.forwardRef(function NavigationContainer(
|
||||
if (skipTrackingRef.current) {
|
||||
skipTrackingRef.current = false;
|
||||
} else {
|
||||
trackState(state);
|
||||
trackState(getRootState);
|
||||
}
|
||||
|
||||
navigationStateRef.current = state;
|
||||
transactionStateRef.current = null;
|
||||
|
||||
if (!isFirstMountRef.current && onStateChange) {
|
||||
onStateChange(state);
|
||||
onStateChange(getRootState());
|
||||
}
|
||||
|
||||
isFirstMountRef.current = false;
|
||||
}, [state, onStateChange, trackState]);
|
||||
}, [state, onStateChange, trackState, getRootState]);
|
||||
|
||||
return (
|
||||
<NavigationBuilderContext.Provider value={builderContext}>
|
||||
|
||||
@@ -321,7 +321,28 @@ it('handle resetting state with ref', () => {
|
||||
});
|
||||
|
||||
expect(onStateChange).toBeCalledTimes(1);
|
||||
expect(onStateChange).lastCalledWith(state);
|
||||
expect(onStateChange).lastCalledWith({
|
||||
index: 1,
|
||||
key: '5',
|
||||
routeNames: ['foo', 'foo2', 'bar', 'baz'],
|
||||
routes: [
|
||||
{
|
||||
key: 'baz',
|
||||
name: 'baz',
|
||||
state: {
|
||||
index: 0,
|
||||
key: '6',
|
||||
routeNames: ['qux', 'lex'],
|
||||
routes: [{ key: 'qux', name: 'qux' }, { key: 'lex', name: 'lex' }],
|
||||
stale: false,
|
||||
type: 'test',
|
||||
},
|
||||
},
|
||||
{ key: 'bar', name: 'bar' },
|
||||
],
|
||||
stale: false,
|
||||
type: 'test',
|
||||
});
|
||||
});
|
||||
|
||||
it('handle getRootState', () => {
|
||||
|
||||
@@ -534,7 +534,19 @@ it('updates route params with setParams applied to parent', () => {
|
||||
key: '0',
|
||||
routeNames: ['foo', 'bar'],
|
||||
routes: [
|
||||
{ key: 'foo', name: 'foo', params: { username: 'alice' } },
|
||||
{
|
||||
key: 'foo',
|
||||
name: 'foo',
|
||||
params: { username: 'alice' },
|
||||
state: {
|
||||
index: 0,
|
||||
key: '1',
|
||||
routeNames: ['baz'],
|
||||
routes: [{ key: 'baz', name: 'baz' }],
|
||||
stale: false,
|
||||
type: 'test',
|
||||
},
|
||||
},
|
||||
{ key: 'bar', name: 'bar' },
|
||||
],
|
||||
stale: false,
|
||||
@@ -549,7 +561,19 @@ it('updates route params with setParams applied to parent', () => {
|
||||
key: '0',
|
||||
routeNames: ['foo', 'bar'],
|
||||
routes: [
|
||||
{ key: 'foo', name: 'foo', params: { username: 'alice', age: 25 } },
|
||||
{
|
||||
key: 'foo',
|
||||
name: 'foo',
|
||||
params: { username: 'alice', age: 25 },
|
||||
state: {
|
||||
index: 0,
|
||||
key: '1',
|
||||
routeNames: ['baz'],
|
||||
routes: [{ key: 'baz', name: 'baz' }],
|
||||
stale: false,
|
||||
type: 'test',
|
||||
},
|
||||
},
|
||||
{ key: 'bar', name: 'bar' },
|
||||
],
|
||||
stale: false,
|
||||
|
||||
@@ -62,7 +62,7 @@ export default function useDevTools({ name, reset, state }: Options) {
|
||||
);
|
||||
|
||||
const trackState = React.useCallback(
|
||||
(state: State) => {
|
||||
(getState: () => State) => {
|
||||
if (!devTools) {
|
||||
return;
|
||||
}
|
||||
@@ -71,9 +71,11 @@ export default function useDevTools({ name, reset, state }: Options) {
|
||||
devTools.send(actions.current.shift(), lastStateRef.current);
|
||||
}
|
||||
|
||||
const state = getState();
|
||||
|
||||
if (actions.current.length) {
|
||||
devTools.send(actions.current.pop(), state);
|
||||
} else if (lastStateRef.current !== state) {
|
||||
} else {
|
||||
devTools.send('@@UNKNOWN', state);
|
||||
}
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ export default function useOnGetState({
|
||||
const route = React.useContext(NavigationRouteContext);
|
||||
const key = route ? route.key : 'root';
|
||||
|
||||
const getter = React.useCallback(() => {
|
||||
const getRehydratedState = React.useCallback(() => {
|
||||
const state = getState();
|
||||
return {
|
||||
...state,
|
||||
@@ -26,6 +26,6 @@ export default function useOnGetState({
|
||||
}, [getState, getStateForRoute]);
|
||||
|
||||
React.useEffect(() => {
|
||||
return addStateGetter && addStateGetter(key, getter);
|
||||
}, [addStateGetter, getter, key]);
|
||||
return addStateGetter && addStateGetter(key, getRehydratedState);
|
||||
}, [addStateGetter, getRehydratedState, key]);
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ export default function useStateGetters() {
|
||||
const stateGetters = React.useRef<Record<string, NavigatorStateGetter>>({});
|
||||
|
||||
const getStateForRoute = React.useCallback(
|
||||
routeKey =>
|
||||
(routeKey: string) =>
|
||||
stateGetters.current[routeKey] === undefined
|
||||
? undefined
|
||||
: stateGetters.current[routeKey](),
|
||||
|
||||
Reference in New Issue
Block a user