Пользовательский интерфейс Snapchat в настоящее время настроен с плавающим заголовком SearchBar, который, похоже, используется на нескольких экранах / вкладках. Я хотел бы реплицировать общий заголовок SearchBar с помощью реакции-навигации. В настоящее время у меня есть наполовину рабочее решение ...
![Half working solution](https://i.stack.imgur.com/wmDp6.gif)
В настоящее время, хотя у меня установлен headerTitle в StackNavigator, похоже, что заголовок отображается совершенно новый SearchBar (вы можете видеть легкое мерцание, указывающее на его отображение) при переходе к экрану результатов поиска.
Вот настройки, которые у меня есть для одного из стеков внутри моего TabNavigator.
function NetworkStack({ route, navigation }) {
return (
<Network.Navigator
initialRouteName="NetworkEventList"
screenOptions={({ navigation, route }) => ({
headerTitle: () => <Search navigation={navigation} route={route} stackName={"NetworkStack"}/>,
})}>
<Network.Screen
name="NetworkSearchResults"
component={SearchResults}
options={({ navigation, route }) => ({
//headerTitle: () => <Search navigation={navigation} route={route} focused={true} stackName={"NetworkStack"}/>,
headerBackImage: () => <BackButton navigation={navigation} shouldPop={true}/>,
headerBackTitleVisible: false,
gestureEnabled: true
})}/>
<Network.Screen
name="NetworkEventList"
component={NetworkEventList}
options={({ navigation, route }) => ({
headerLeft: () => <ProfileSidebarButton navigation={navigation}/>,
//headerTitle: () => <Search navigation={navigation} focused={false} stackName={"NetworkStack"}/>,
headerRight: () => <CommunityButton navigation={navigation} stackName={"NetworkStack"}/>
})}/>
</Network.Navigator>
)
}
Ниже мой TabNavigator.
function TabNavigator({ navigation, route }) {
return (
<Tab.Navigator
initialRouteName="NetworkStack"
tabBar={props => <TabBar {...props}/>}>
<Tab.Screen
name="CheckInStack"
component={CheckInStack}/>
<Tab.Screen
name="NetworkStack"
component={NetworkStack}/>
<Tab.Screen
name="MapStack"
component={MapStack}/>
</Tab.Navigator>
);
}
Лог c, который переходит к компоненту результатов поиска, находится внутри onFocus слушателя ввода. Вот код для этого ...
const searchBarFocus = () => {
switch(props.stackName) {
case "MapStack":
var searchType = props.searchGoogle ? "AddEstablishment" : "ViewingEstablishments";
props.navigation.navigate('MapSearchResults', {searchType: searchType});
break;
case "NetworkStack":
props.addingMarkers(false);
var searchType = props.searchForPosting ? "ViewingEstablishments" : "ViewingUsers";
let index = null;
let routeState = props.route.state;
if(routeState) index = routeState.index;
if(index !== 1) {
console.log(props.navigation);
props.navigation.navigate('NetworkSearchResults', {searchType: searchType});
}
break;
case "CheckInStack":
props.addingMarkers(false);
props.navigation.navigate('CheckInSearchResults', {searchType: "ViewingUsers"});
break;
}
}
Как мне go настроить мои элементы навигации, чтобы у меня был единственный элемент SearchBar, который монтируется один раз? Вы можете видеть на загруженном мной гифке, что панель поиска также теряет фокус при навигации, это также связано со вторым рендерингом / установкой моего компонента поиска. Любые предложения будут высоко ценится!