В моем приложении есть заголовок, который должен отображать другую кнопку в зависимости от того, есть ли у пользователя уведомления. Вот как я сейчас настроил его на своих страницах:
static navigationOptions = ({ navigation }) => {
return {
title: 'My Profile',
headerRight: () => (
<Button
type="clear"
icon={() => <Icon
type="material-community"
size={25}
name={UserProvider.bNotifications ? 'bell' : 'bell-outline'}
color={UserProvider.bNotifications ? COLORS.WARNING : COLORS.WHITE}
/>}
onPress={() => navigation.navigate('Notifications', null)}
/>
)
}
};
Проблема в том, что если UserProvider.bNotifications
меняет значение, кнопка заголовка не обновляется, пока страница не будет изменена / перерисована.
Я хочу переключиться на использование свойства navigation
, которое передается в эти navigationOptions
, но я не знаю, как получить к нему доступ из-за пределов стека навигации. UserProvider
является классом stati c (НЕ компонентом), поэтому я не могу получить доступ к навигационному элементу обычным способом (или с помощью ловушки useNavigation
).
У меня есть NavigationProvider
класс, который имеет доступ к NavigationContainer
для приложения. Я использую его для запуска навигации без компонентов. Есть ли какой-нибудь способ, которым я могу установить параметры для свойства навигации, используя ту же ссылку?
NavigationProvider:
import { NavigationActions } from 'react-navigation';
let _navigator;
function getNavigator() {
return _navigator;
}
function setTopLevelNavigator(navigatorRef) {
_navigator = navigatorRef;
}
function navigate(routeName, params) {
_navigator.dispatch(
NavigationActions.navigate({
routeName,
params,
})
);
}
function goBack() {
_navigator.dispatch(
NavigationActions.back()
);
}
export default {
navigate,
setTopLevelNavigator,
getNavigator,
goBack
};
Ссылка установлена следующим образом в моем компоненте приложения верхнего уровня:
<AppContainer
ref={navigatorRef => {
console.log(navigatorRef.props.navigation);
NavigationProvider.setTopLevelNavigator(navigatorRef);
}}
/>
РЕДАКТИРОВАТЬ - UserProvider Это только суть моего класса UserProvider, но он должен передать, как он работает.
export default class UserProvider {
private static _bNotifications: boolean;
static get bNotifications(): boolean {
if (!this.hasInitNotifications)
this.initNotficationWatch();
return this._bNotifications;
}
static set bNotifications(bNotifications: boolean) {
this._bNotifications = bNotifications;
}
static initNotficationWatch() {
//Firebase listener on notification
if(notifications){
this.bNotifications = true;
} else {
this.bNotifications = false;
}
}
}