React Navigation:在抽屉上滑动在 Android 中不起作用

新手上路,请多包涵

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

我用 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);

原文由 Sadman Muhib Samyo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 704
2 个回答

我找到了解决方案。 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 的最新文档解决了这个问题

原文由 Sadman Muhib Samyo 发布,翻译遵循 CC BY-SA 4.0 许可协议

在项目的 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 Navigation > 5.x 中

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

 import 'react-native-gesture-handler';

原文由 Mahdi Bashirpour 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题