要退出应用,请在Android上以本机方式在Android上单击鼠标后退?

时间:2019-03-18 08:29:13

标签: react-native react-native-android

在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")

预期:

返回单击硬件按钮,转到上一屏幕。

谢谢。

5 个答案:

答案 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()
}
相关问题