Android Hardware Back Button causes Blank Screen
まだ誰も着手していません。
評価
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 初心者へのやさしさ
- 25/100
- issue の種類
- バグ
- 明瞭さ
- 説明が足りない
- 活発さ
- 停滞
- 技術スタック
- android, javascript, react-native
- 領域
- mobile-dev
調査の方向性
index.js のナビゲーション設定と Android の hardwareBackButton オプションから始め、報告されている React Native と Android のバージョンで、記載された再現手順に従います。Native Back Handler の回避策を使った場合と再起動時の動作を比較します。hardware Back Button の後に再起動しても空白の画面が表示されなければ完了です。
索引モデルが issue の本文から書いたものです。
説明
🐛 Bug Report
Only on Android, when the user uses the Hardware Back Button and they are at the landing screen, the Activity closes. Then when the application is started again I see a blank screen. This happens only if I use the hardware back. If I minimize the application using the hardware home button, then there are no issues.
I read somewhere that I should use the events().registerAppLaunchedListener but that doesn't get invoked.
Have you read the Contributing Guidelines on issues?
Yes, I have read them.
To Reproduce
- Create a blank application using the React Native CLI
- Install the latest version of the navigation library
- Create a Bottom Navigation
- As the first tab create a Stack Navigator
- Press the hardware back button on the phone
- Enter the application again
ERROR: Blank screen.
NOTES: I am using a legacy project that somebody else wrote and I am trying to maintain/update it.
The way the bottom tab bar is created is very weird to me. I found that this code causes the tab bar to appear, however, without this code the tab bar is missing:
// hide the tab bar when navigating to screens that are not in tabBarScreens
Navigation.events().registerCommandListener((name, params) => {
let componentNames = params &&
params.layout &&
params.layout.data && [params.layout.data.name]
componentNames =
componentNames ||
(params &&
params.layout &&
Array.isArray(params.layout) &&
params.layout
.map((layout) => layout.data && layout.data.name)
.filter((c) => c !== undefined))
if (componentNames && componentNames.length === 0) {
componentNames = undefined
}
componentNames =
componentNames ||
(params &&
params.layout &&
params.layout.children &&
params.layout.children
.map((child) => child.data && child.data.name)
.filter((c) => c !== undefined))
if (componentNames && componentNames.length === 0) {
componentNames = undefined
}
componentNames =
componentNames ||
(params &&
params.layout &&
params.layout.root &&
params.layout.root.children &&
params.layout.root.children
.map((child) => child.data && child.data.name)
.filter((c) => c !== undefined))
console.log({ name, params })
switch (name) {
case 'push':
case 'showModal':
if (componentNames && componentNames.length > 0) {
if (
getTabBarScreen(componentNames[componentNames.length - 1]) ===
undefined
) {
store.dispatch(setShouldBeVisible(false))
screenStack.push({
componentName: componentNames[componentNames.length - 1],
tabBarVisible: false,
})
} else {
screenStack.push({
componentName: componentNames[componentNames.length - 1],
})
}
}
break
case 'pop':
case 'dismissModal':
if (screenStack.length > 1) {
screenStack.pop()
}
break
case 'popToRoot':
screenStack = [screenStack[0]]
break
case 'setRoot':
case 'setStackRoot':
if (componentNames && componentNames.length > 0) {
screenStack = componentNames.map((c) => {
return { componentName: c }
})
}
break
}
})
The stack navigation is created as follows:
// This code is executed in the index.js file
let navStack = [
{
screenName: MainScreen.screenName(),
passProps: {
initial: true,
navigateToRunning: true,
},
},
]
const createNavigationStack = (screenList) => {
return screenList.map((item) => {
return {
component: {
name: item.screenName,
passProps: item.passProps,
options: {
animations: {
setStackRoot: {
enabled: false,
},
},
popGesture: false,
hardwareBackButton: {
dismissModalOnPress: true,
popStackOnPress: true,
bottomTabsOnPress: 'previous',
},
},
},
}
})
}
Navigation.setRoot(createNavigationStack(navStack))
I have no idea why things are done this way. The only workaround to my problem was to override the Native Back Handler and just disable it:
BackHandler.addEventListener('hardwareBackPress', () => true);
Expected behavior
I expect that the application will return to the last screen that was displayed when it is relaunched.
Actual Behavior
A Blank screen is shown
Your Environment
- React Native Navigation version: 7.30.2
- React Native version: 0.70.5
- Platform(s) (iOS, Android, or both?): Android 11
- Device info (Simulator/Device? OS version? Debug/Release?): Simulator + Samsung Galaxy S20 FE, both Debug and Release
Reproducible Demo
N/A, the code is proprietry.
Are you willing to resolve this issue by submitting a Pull Request?
- ✖️ Yes, I have the time, and I know how to start.
- ✖️ Yes, I have the time, but I don't know how to start. I would need guidance.
- ✅ No, I don’t have the time and I’m okay to wait for the community / maintainers to resolve this issue.
- 主要言語
- MDX
- スター
- 13.2k
- フォーク
- 2.6k
- 平均マージ
- 3時間 21分
- マージ済み PR(30日)
- 5
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートなし
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
wix/react-native-navigation のほかの issue
-
needs triage triage: documentation
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
wix/react-native-navigation#8343 · コメント 1 件 ·
-
[Fix] searchBar `focus:` true ignored on mergeOptions when searchController already exists対応中かも @IsaacIsrael が 161 日前に担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
wix/react-native-navigation#8318 ·
-
needs triage type: accepted/bug
難易度 4/5 3〜5日 初心者へのやさしさ 25/100
wix/react-native-navigation#8365 · コメント 2 件 ·
-
`showOverlay` creates a scene-less `UIWindow`, so overlays never appear under UIScene lifecycle対応中かも @yedidyak が 7 日前に担当しました。 オープンplatform: iOS type: accepted/bug
難易度 3/5 1〜2日 初心者へのやさしさ 68/100
wix/react-native-navigation#8345 · コメント 2 件 · リアクション 2 件 ·
-
platform: iOS type: accepted/bug
難易度 4/5 3〜5日 初心者へのやさしさ 48/100
wix/react-native-navigation#8340 ·
wix/react-native-navigation の issue をすべて見る
似ている issue
-
good first issue user interface
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
pentakoron1/brazier#41 ·
メンテナーはふだん 1 日以内に返信
-
Area-UIUX Issue-Bug Issue-Easy (good first issue)
難易度 2/5 1〜3時間 初心者へのやさしさ 67/100
TeamAmaze/AmazeFileManager#4769 ·
メンテナーはふだん 7 日以内に返信
-
ios:player
難易度 2/5 1〜3時間 初心者へのやさしさ 84/100
メンテナーはふだん 1 日以内に返信
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
GHRik/bielik_oneclick_launcher#36 ·
メンテナーはふだん 1 日以内に返信
-
area:core-app
難易度 2/5 1〜3時間 初心者へのやさしさ 62/100
HelloAOLab/seed-bible#2152 ·
メンテナーはふだん 1 日以内に返信