【问题标题】:React Navigation: Swipe on drawer does not work in AndroidReact Navigation:在抽屉上滑动在 Android 中不起作用
【发布时间】:2018-11-20 14:16:49
【问题描述】:

我一直在寻找解决方案很长时间,但令人惊讶的是,我认为还没有人遇到过。所以我发了。

我用 React Navigation V3 创建了一个简单的 Drawer Navigator。我添加了一个菜单图标,当我单击它时,抽屉就会出现。但是,没有手势起作用。从左向右滑动不会做任何事情。即使抽屉打开,点击空白区域也不会关闭抽屉。

这是我的代码:

import {
    createStackNavigator,
    createSwitchNavigator,
    createAppContainer,
    createDrawerNavigator
} from 'react-navigation';
import Home from './screens/Home';
import LoginForm from './screens/LoginForm';
import Articles from './screens/Articles';

const AuthStack = createStackNavigator({
    LoginScreen: LoginForm
});

const AppStack = createDrawerNavigator({
    HomeScreen: Home,
    ArticlesScreen: Articles
});

const RootNavigator = createSwitchNavigator(
    {
        Auth: AuthStack,
        App: AppStack
    },
    {
        initialRouteName: 'Auth'
    }
);

export default createAppContainer(RootNavigator);

【问题讨论】:

    标签: android react-native react-navigation swipe


    【解决方案1】:

    我找到了解决方案。 React Navigation 依赖于 react-native-gesture-handler 库。在 React Navigation 文档的安装部分,它只说使用命令 react-native link 创建链接。这对 iOS 来说已经足够了。但对于 Android,您必须编辑 MainActivity.java 文件,以便手势处理程序库可以按预期工作:

    import com.facebook.react.ReactActivity;
    + import com.facebook.react.ReactActivityDelegate;
    + import com.facebook.react.ReactRootView;
    + import com.swmansion.gesturehandler.react.RNGestureHandlerEnabledRootView;
    
    public class MainActivity extends ReactActivity {
    
      @Override
      protected String getMainComponentName() {
        return "Example";
      }
    
    +  @Override
    +  protected ReactActivityDelegate createReactActivityDelegate() {
    +    return new ReactActivityDelegate(this, getMainComponentName()) {
    +      @Override
    +      protected ReactRootView createRootView() {
    +       return new RNGestureHandlerEnabledRootView(MainActivity.this);
    +      }
    +    };
    +  }
    }
    

    参考文档:https://kmagiera.github.io/react-native-gesture-handler/docs/getting-started.html

    实际上,React Navigation 文档中没有说明修改任何文件,因为它特定于 react-native-gesture-handler 而不是 React Navigation。我将答案保留在这里,以便对其他人有所帮助。

    更新:最新的 React Navigation 文档解决了这个问题

    【讨论】:

    • 为我工作。我正在使用无线调试,所以我需要重新构建并重新安装 apk 才能使其正常工作
    • 添加上述代码后确保更新捆绑包如果不适用于 android,然后运行 ​​react-native run-android 或运行 cd android -> gradlew clean -> 然后运行 ​​react-native run-android。这将使它工作。
    • 我已经放置了这些行。不幸的是,它已经停止了其他触摸事件。现在,我无法单击屏幕的任何组件。你能帮忙吗?
    • 我有两个应用程序;旧的可以工作,最新的不行。 github.com/kmagiera/react-native-gesture-handler/issues/653
    • 我在 react-native 0.60.4 react-navigation 3.11.1 中遇到了同样的问题,现在解决我的问题。它正在工作。谢谢。
    【解决方案2】:

    在您项目的index.js 中,只需使用gestureHandlerRootHOC

    import {AppRegistry} from 'react-native';
    import App from './App';
    import {name as appName} from './app.json';
    import { gestureHandlerRootHOC } from 'react-native-gesture-handler'
    
    AppRegistry.registerComponent(appName, () => gestureHandlerRootHOC(App));
    

    资源:https://github.com/react-navigation/drawer/issues/105#issuecomment-540667009

    更新:

    在 React 导航中 > 5.x

    只需将react-native-gesture-handler 放在根index.js 的开头

    import 'react-native-gesture-handler';
    

    【讨论】:

    • 谢谢,我不得不努力让手势处理程序发挥作用。这解决了我的问题
    • index.js 在哪里?
    • 您好,我正在尝试您的建议,但它不会为我解决抽屉无法关闭的问题。你能帮我吗?stackoverflow.com/questions/68259260/…
    【解决方案3】:

    似乎在 0.61.0 以上的版本中已修复,但对于旧版本,这对我有用。

    index.js

    . . .
    import {gestureHandlerRootHOC} from 'react-native-gesture-handler';
    AppRegistry.registerComponent(appName, () => gestureHandlerRootHOC(App));
    . . .
    

    【讨论】:

      【解决方案4】:

      React Native 文档更新了这个问题,你可以在下面的链接中找到一个名为 Installing dependencies into a bare React Native project 的部分

      https://reactnavigation.org/docs/en/getting-started.html#installation

      【讨论】:

      • 这个更新早就被我提过了。在发布自己的答案之前阅读答案。
      • 你还没有添加正确文档的链接,你可以先检查你的评论@sadman
      • 添加文档链接没有任何意义,因为我已经在回答中指示了相同的内容。但我确实处理了更新新闻,这就足够了。
      猜你喜欢
      • 1970-01-01
      • 2019-05-09
      • 2021-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多