Спросите разрешение на конкретный экран в Android - PullRequest
0 голосов
/ 08 июля 2019

Для навигации по собственным реакциям приложений я использую реагирующую навигацию v2, здесь я создал навигацию с помощью bottomTabs. Вот обработчик навигации

import { Navigation } from "react-native-navigation";
import { width, height } from "../utils/screenResolution";
import { bottomTabIcon, topBarOpts } from "../components";

const sideBarWidth = width * 0.65;

export const goToAuth = () =>
  Navigation.setRoot({
    root: {
      stack: {
        id: "AuthNav",
        children: [
          {
            component: {
              name: "SignInScreen",
              options: {
                topBar: { visible: false, height: 0 }
              }
            }
          }
        ]
      }
    }
  });

export const goHome = async () => {
  let icon1 = await bottomTabIcon("CollectionScreen", "Collection", "archive");
  let icon2 = await bottomTabIcon("MainScreen", "Home", "home");

  let icon3 = await bottomTabIcon("CaptureScreen", "Capture", "camera");
  Navigation.setRoot({
    root: {
      sideMenu: {
        right: {
          component: {
            name: "SideBar"
          }
        },
        center: {
          bottomTabs: {
            id: "AppNav",
            children: [icon1, icon2, icon3]
          }
        },
        options: {
          sideMenu: {
            right: {
              width: sideBarWidth
            }
          }
        }
      }
    }
  });
  Navigation.mergeOptions("MainScreen", {
    bottomTabs: {
      currentTabIndex: 1
    }
  });
};

Создание вкладки значков с помощью этой функции bottomTabIcon.

import Icon from "react-native-vector-icons/FontAwesome";
import { topBarOpts } from "./";
import { PRIMARY, BOTTOM_TAB_BACKGROUND, TAB_ICON } from "../../assets/color";

let bottomTabIcon = async (name, text, iconName) => {
  let icon = {
     stack: {
       children: [
         {
    component: {
      name: name,
      id: name,
      options: {
        bottomTab: {
          text: text,
          fontSize: 12,
          selectedIconColor: PRIMARY,
          iconColor: TAB_ICON,
          icon: await Icon.getImageSource(iconName, 20)
        }
      }
    }
         }
      ]
    }
  };

  if (name === "CaptureScreen") {
    icon.stack.children[0].component.options.bottomTabs = {
      visible: false,
      drawBehind: true,
      animate: true
    };
    icon.stack.children[0].component.options.topBar = {
      visible: false,
      height: 0
    };
  } else {
    icon.stack.children[0].component.options.bottomTabs = {
      backgroundColor: BOTTOM_TAB_BACKGROUND
    };
    icon.stack.children[0].component.options.topBar = await topBarOpts("Example");
  }

  return icon;
};

export { bottomTabIcon };

Вот проблема, когда пользователь входит в приложение, запрашивая разрешения (камера, аудио и т. Д.) В MainScreen. Я хочу сделать это на определенном экране, после чего я обнаруживаю, что все экраны в bottomTabs смонтированы. Так что, если Я вызываю что-то, чтобы сделать в componentDidMount в CaptureScreen, это будет работать в MainScreen. Как я могу решить эту часть? Я довольно новичок в реагирующем родном языке, поэтому кое-что вы можете найти странным в этом коде. Спасибо за помощь и внимание.

1 Ответ

1 голос
/ 08 июля 2019

Иметь разрешение на вызовы только при монтировании определенных экранов или на дочернем экране, где это необходимо, не на родительском экране или в навигаторах.

В вашем случае вы звоните им, беря указатель маршрута в реагирующей навигации. Добавьте код разрешения на дочернем экране или там, где требуются разрешения, и они начнут работать.

...