react-native modal view 在调试模式下不显示

react-native modal view not showing up in debug mode

我为我的 android 应用程序开发了一个自定义模式选择器,除了一件重要的事情外,它工作正常: 当我处于调试模式时,它根本不工作。 我只是不明白如果在生产模式下一切正常,那会怎样!

我相信我不必告诉你拥有一个有效的调试环境是多么重要,而且我不知道这里出了什么问题! :( 我选择的调试器是 VS 代码,但当我通过普通终端和 chrome 调试器

启动应用程序时,它完全相同

import { useTheme } from '@react-navigation/native';
import  React, { useState } from 'react';
import { useNavigation } from '@react-navigation/native';
import {LogBox, SafeAreaView, Animated, StyleSheet, ScrollView, Switch, Button, View, Text, Image, Alert, TouchableOpacity, TouchableHighlight} from 'react-native';
import { Card } from 'react-native-elements';
import Picker from './MyPicker.js'

function Home() {
  const { colors } = useTheme();
  const navigation = useNavigation()

  const [selectedItem, setSelectedItem] = useState(null);
  const [selectedCount, setSelectedCount] = useState({key: 'Choose', value: null});

  let countItems = [{key: 'Choose', value: '0'}, {key: '1 Foo', value: '1'}, {key: '2 Foos', value: '2'}, {key: '3 Foos', value: '3'}, {key: '4 Foos', value: '4'}, {key: '5 Foos', value: '5'}, {key: '6 Foos', value: '6'}, {key: '7 Foos', value: '7'}, {key: '8 Foos', value: '8'}, {key: '9 Foos', value: '9'}, {key: '10 Foos', value: '10'}, {key: '11 Foos', value: '11'}, {key: '12 Foos', value: '12'}, {key: '13 Foos', value: '13'}, {key: '14 Foos', value: '14'}, {key: '15 Foos', value: '15'}, {key: '16 Foos', value: '16'}, {key: '17 Foos', value: '17'}, {key: '18 Foos', value: '18'}, {key: '19 Foos', value: '19'}, {key: '20 Foos', value: '20'}];


  const onPress = () => {
    console.log("navigate triggered");
    navigation.navigate("screen2")
  }

  const setItem = (value) => {
    // set parent state
    setSelectedCount(value);
    setSelectedItem(value)
    console.log("you touched option: " + value);
  }

  return (
    <View>
      <SafeAreaView>
        <ScrollView>
        
                <TouchableOpacity style={{backgroundColor:'green', width:'100%', height:30}} onPress={() => onPress() }>
                  <Text>Go to screen2</Text>
                </TouchableOpacity>
                <Card containerStyle={{backgroundColor: colors.cardBackgroundColor, borderColor: colors.borderColor, borderWidth: 2, borderRadius: 5}}>
                   
                    <View style={{width: "100%", height:10}}></View>
                    <View style={{flex: 1, flexDirection: 'row', justifyContent: 'space-between'}}>
                        <View style={{width: '55%', flexDirection: 'column', justifyContent: 'space-between'}}>
                            <View style = {{  paddingLeft: 5, borderWidth: 1, borderRadius: 5}}>
                                <Picker icon='1' title='Test:' data={countItems} action={setItem} selectedItem={selectedCount} isActive={true}/>
                            </View>
                        <View style={{width: "100%", height:10}}></View>

                        <TouchableOpacity style = {styles.button} onPress={() => onPress() }>
                            <Text style = {{textAlign: 'center', color: 'white', fontSize: 11, fontWeight: 'bold'}}>
                                Add Foo(s)
                            </Text>
                        </TouchableOpacity> 
                        </View> 

                    </View>
       
          </Card>
        </ScrollView>
      </SafeAreaView>
    </View>
  );
};
import React, {useState, useEffect, useRef} from 'react';
import {StyleSheet, View, Text, TouchableOpacity, Pressable, FlatList} from 'react-native';
import Modal from 'react-native-modal';
import Icon from 'react-native-vector-icons/FontAwesome';
import { useTheme} from '@react-navigation/native';


// ------------------PickerRow-----------------------------------------------------------------------
function Picker(props) {

    const { colors } = useTheme(); // works
    const theme = useTheme();
    const [selectedItem, setSelectedItem] = useState('choose');
    const [coordinates, setCoordinates] = useState({w: 100, x: 0, y: 100});
    const [isVisible, setIsVisible] = useState(false);
    const [isActive, setIsActive] = useState();

    useEffect(() => {
        setIsActive(props.isActive);
    })


    const showPicker = () => {
        
        measureView.current.measure((x, y, width, height, pageX, pageY) => {
            let coords = {w: width, x: pageX, y: pageY};
            setCoordinates(coords);
        })

        if (isActive) {
            setIsVisible(true);
        }
    }

    const setItem = (value) => {
        // set parent state
        props.action(value)
        setIsVisible(false);
    }

    const renderItem = ({item}) => {
        return <View>
                    <Pressable onPress={() => setItem(item)}>
                        <Text style={{color: colors.text, fontSize: 17, alignSelf: 'center', paddingTop: 3}}>
                            {item.key}
                        </Text>
                    </Pressable>
                </View>
    }

    const measureView = useRef();

    return (
    <Pressable 
        onPress={() => showPicker()}
        ref={view => measureView.current = view}>
      <View
            style = {{
            flexDirection: 'row', 
            justifyContent: 'space-between', 
            alignItems: 'center', 
            height: 25, 
        }}
        >
        { props.icon ?
        <View style = {styles.icon} >
            <Text style = {styles.text}>{props.icon}</Text>
        </View>
        : 
        <View/>
        }
        <View style = {styles.description} >
            <Text style = {{fontSize: 11, fontWeight: 'bold', color: colors.text, textAlign: 'left', marginLeft: 5,}}>{props.title}</Text>
        </View>

        {/* - - - - - Dropdown - - - - - */}
        <View style={{flex:5, backgroundColor: 'transparent'}}>
            { isActive ? 
            <TouchableOpacity onPress={showPicker}>
                <Text style={{color: colors.textSubtitleColor, fontSize: 11, alignSelf: 'flex-end', paddingRight: 10}}>
                      {props.selectedItem.key}
                </Text>
            </TouchableOpacity>
            :
            <Icon.Button
                style={{alignSelf: 'flex-end', paddingRight: 10}}
                name="lock"
                backgroundColor="transparent"
                size={12}
                onPress={() => console.log('locked')}
                color="gray"
            />
            }

            <Modal 
                isVisible={isVisible}
                style={{backgroundColor: colors.frameBackground,
                        borderColor: colors.borderColor, 
                        borderWidth: 1, 
                        borderRadius: 5,
                        position: 'absolute',
                        width: 180,
                        height: 'auto',
                        maxHeight: 200,
                        left:  coordinates.x-25,
                        top: coordinates.y+4}}
                backdropOpacity={0}
                onBackdropPress={() => setIsVisible(false)}
                >
                    <View>
                        <FlatList
                            data={props.data}
                            renderItem={renderItem}
                        />
                    </View>
            </Modal>
        </View>

      </View>
    </Pressable>
      
    );
    }
  export default Picker;

非常感谢任何帮助

问题出在模态本身,无论出于何种原因,来自 react-native-modal 的模态在开发者模式下存在可见性问题(或某种延迟问题)。 我从 react-native 切换到标准模态,问题就解决了 ;)