在Android Mi Note 3上,当我单击后退应用程序出口时,硬件后退按钮不会触发handleBackPress
。
我已经执行了以下代码,但是未调用handleBackPress
。
componentDidMount() {
BackHandler.addEventListener('hardwareBackPress', this.handleBackPress);
}
componentWillUnmount() {
BackHandler.removeEventListener('hardwareBackPress', this.handleBackPress);
}
handleBackPress = () => {
this.goBack(); // works best when the goBack is async
return true;
}
导航代码:
const ModalSignUp = createStackNavigator(
{
Signup: { screen: Signup, key: 'Signup' },
PartyList: { screen: PartyList, key: 'PartyList' },
StatesList: { screen: StatesList, key: 'StatesList' },
},
{
initialRouteName: 'Signup',
headerMode: 'none',
mode: 'card',
}
);
导航:
this.props.navigation.push("StatesList")
预期:
返回单击硬件按钮,转到上一屏幕。
谢谢。
答案 0 :(得分:1)
您的错误可能是您获得react-natigation
的下一个视图的方式。
您需要使用.push
在堆栈上创建一个新视图,然后单击“后退”按钮,将触发.goBack()
。
默认情况下,后退按钮将始终使导航返回到堆栈上,但是如果堆栈中只有一个视图(这种情况仅在使用.navigate
时发生),应用程序将退出。
不知道如何浏览视图,但这可以解决。
编辑:要解决此问题,在浏览视图时,使用navigation.push('viewname')
而非navigation.navigate('viewname')
。您不需要任何其他方法(例如您在问题中提出的方法)。
也请检查docs来了解导航的工作原理,或者检查this question
答案 1 :(得分:0)
尝试一下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
namespace ConsoleApplication106
{
class Program
{
static void Main(string[] args)
{
DataTable dt = new DataTable();
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Month", typeof(DateTime));
dt.Columns.Add("Volume", typeof(int));
dt.Rows.Add(new object[] {"A", DateTime.ParseExact("2019-01", "yyyy-MM", System.Globalization.CultureInfo.InvariantCulture), 1400});
dt.Rows.Add(new object[] { "B", DateTime.ParseExact("2019-01", "yyyy-MM", System.Globalization.CultureInfo.InvariantCulture), 1100 });
dt.Rows.Add(new object[] { "B", DateTime.ParseExact("2019-02", "yyyy-MM", System.Globalization.CultureInfo.InvariantCulture), 400 });
dt.Rows.Add(new object[] { "C", DateTime.ParseExact("2019-01", "yyyy-MM", System.Globalization.CultureInfo.InvariantCulture), 6500 });
dt.Rows.Add(new object[] { "B", DateTime.ParseExact("2019-03", "yyyy-MM", System.Globalization.CultureInfo.InvariantCulture), 6500 });
dt.Rows.Add(new object[] { "A", DateTime.ParseExact("2019-02", "yyyy-MM", System.Globalization.CultureInfo.InvariantCulture), 500 });
dt.Rows.Add(new object[] { "C", DateTime.ParseExact("2019-02", "yyyy-MM", System.Globalization.CultureInfo.InvariantCulture), 35 });
DateTime[] dates = dt.AsEnumerable().Select(x => x.Field<DateTime>("Month")).Distinct().OrderBy(x => x).ToArray();
DataTable pivot = new DataTable();
pivot.Columns.Add("Name", typeof(string));
foreach (DateTime date in dates)
{
pivot.Columns.Add(date.ToString("yyyy-MM"), typeof(int));
}
var groups = dt.AsEnumerable().GroupBy(x => x.Field<string>("Name")).ToList();
foreach(var group in groups)
{
DataRow newRow = pivot.Rows.Add();
newRow["Name"] = group.Key;
foreach(DataRow row in group)
{
newRow[row.Field<DateTime>("Month").ToString("yyyy-MM")] = row.Field<int>("Volume");
}
}
}
}
}
答案 2 :(得分:0)
尝试使用return false
代替return true
。
答案 3 :(得分:0)
尝试一下...这个对我有用:在componentWillUnmount
BackHandler.removeEventListener('hardwareBackPress', () => {});
此外,请确保在每种情况下都检查this.goBack();
return
内容
goback = () => {
if (condition2)
// handling
return something;
if (condition2)
// handling
return something;
// default:
return true;
};
答案 4 :(得分:0)
1。导入
Student5(222, "Morty", 25)
2。构造函数
import { BackHandler, DeviceEventEmitter } from 'react-native'
3。添加和删除侦听器
constructor(props) {
super(props)
this.backPressSubscriptions = new Set()
}
4。向后退
componentDidMount() {
DeviceEventEmitter.removeAllListeners('hardwareBackPress')
DeviceEventEmitter.addListener('hardwareBackPress', () => {
let invokeDefault = true
const subscriptions = []
this.backPressSubscriptions.forEach(sub => subscriptions.push(sub))
for (let i = 0; i < subscriptions.reverse().length; i += 1) {
if (subscriptions[i]()) {
invokeDefault = false
break
}
}
if (invokeDefault) {
BackHandler.exitApp()
}
})
this.backPressSubscriptions.add(this.handleHardwareBack)
}
componentWillUnmount() {
DeviceEventEmitter.removeAllListeners('hardwareBackPress')
this.backPressSubscriptions.clear()
}