不变违规:App(...) 渲染没有返回任何内容。这通常意味着缺少 return 语句。反应原生

Posted

技术标签:

【中文标题】不变违规:App(...) 渲染没有返回任何内容。这通常意味着缺少 return 语句。反应原生【英文标题】:invariant violation: App(...)Nothing was returned from render. this usually means a return statement is missing. react native 【发布时间】:2020-07-11 13:23:09 【问题描述】:

大家好!我只是想征求您的意见,为什么我的代码在标题处显示错误。我已经解决了 2 天,但还没有解决。我希望有人能帮助我。谢谢!这是我的实际代码。我正在使用 cloudinary 来保存图像(效果很好)和 firestore 作为我的数据库。当我在 Firestore 上为数据库应用 Insert 函数时发生错误。

import React,  useState, Component  from 'react'
import 
  StyleSheet,
  View,
  Text,
  Dimensions,
  TouchableOpacity,
  Image,
  TextInput,
  Platform,
  ActivityIndicator, ScrollView, KeyboardAvoidingView, Picker
 from 'react-native';
import ImagePicker from 'react-native-image-picker';
import firebase from './firebase';


const App = (props) => 


  const [photo, setPhoto] = useState('https://res.cloudinary.com/my_Cloud_name/image/upload/v1585540130/bg_3__1580384977_49.145.192.210_rnmved.jpg');



  const selectPhotoTapped = () => 
    const options = 
      title: 'Select Photo',
      storageOptions: 
        skipBackup: true,
        path: 'images',
      ,
    ;


    ImagePicker.showImagePicker(options, (response) => 

       console.log('Response = ', response);
      if (response.didCancel) 
        console.log('User cancelled image picker');
       else if (response.error) 
        console.log('ImagePicker Error: ', response.error);
       else 
        const source = 
          uri: response.uri,
          type: response.type,
          name: response.fileName,
        
        cloudinaryUpload(source)
        console.log('Source: ', source);
        console.log('cloudinary upload: ', photo);
        return (photo);
      
    );
  
  const cloudinaryUpload = (photo) => 
    const data = new FormData()
    data.append('file', photo)
    data.append('upload_preset', 'my_upload_present/')
    data.append("cloud_name", "my_Cloud_name/")
    fetch("https://api.cloudinary.com/v1_1/my_Cloud_name//upload", 
      method: "post",
      body: data
    ).then(res => res.json()).
      then(data => 
        setPhoto(data.secure_url)

      ).catch(err => 
        Alert.alert("An Error Occured While Uploading")
      )
  

  class AddPost extends Component 
    state = 

      image: '',
      section: '',
      unit: '',
      price: '',
      product: '',
      status: '',
      hasError: false,
      errorText: '',
       isLoading: false,
    
    onChangeTitle = title => 
      this.setState( image )
      this.setState( section )
      this.setState( unit )
      this.setState( price )
      this.setState( product )
      this.setState( status )
    


    onSubmit = async () => 
      try 

        const newDocumentData = this.ref.collection('products').doc().id;
        this.setState(
          loading: true,
        );
        const userId = firebase.auth().currentUser.uid;
        this.ref.collection('products').doc(newDocumentData).set(
          store_id: firebase.auth().currentUser.uid,
          pr_name: this.state.product,
          pr_id: newDocumentData,
          pr_price: this.state.price,
          pr_unit: this.state.unit,
          pr_store_name: firebase.auth().currentUser.email, //change into name of store.
          pr_section : this.state.section,
          pr_image: this .state.image,
          prod_status: 'active',
        ).then((docRef) => 
          this.setState(
            image: '',
            section: '',
            unit: '',
            price: '',
            product: '',
            status: '',
            isloading: false,
          );
          Actions.gold();
        )
       catch (e) 
        console.error(e)
      
    

    render() 
      if (this.state.isLoading) 
        return (
          <View style=flex: 1, paddingTop: 20>
            <ActivityIndicator />
          </View>
        );
      
  return (
    <View>
      <View style=styles.imageContainer>
      <Text style=fontSize: 20, textAlign: 'center', marginBottom: 7> Add Product </Text>
      <ScrollView 
          keyboardShouldPersistTaps="handled" 
          showsVerticalScrollIndicator=false>
      <KeyboardAvoidingView enabled >
      <Image source= uri: photo  style=
                    width: 200,
                    height: 200,
                    borderRadius: 100,
                    alignSelf: 'center',
                  />
 <TextInput
   label="Enter Product"
   placeholder="Enter Product"
   label="Enter Product"

   value=this.state.product
            onChangeText=product => this.onChangeTitle(product)

   underlineColorandroid='transparent'

   style=styles.TextInputStyleClass

 />

<TextInput

   placeholder="Enter Price"
   keyboardType='decimal-pad'

   value=this.state.price
   onChangeText=price => this.onChangeTitle(price)
   underlineColorAndroid='transparent'

   style=styles.TextInputStyleClass
 />



<Picker 

                   style=height: 50, width: 300
                   onValueChange=(TextInputValue, itemIndex) =>
                   this.setState(unit: TextInputValue)>
                     <Picker.Item label = "Select Unit" />
               <Picker.Item label = "Kilo" value = "Kilo" />
               <Picker.Item label = "Each" value = "Each" />
               <Picker.Item label = "Bottle" value = "Bottle" />
               <Picker.Item label = "Pack" value = "Pack" />
               <Picker.Item label = "Sack" value = "Sack" />




            </Picker>


          <Picker 

                   style=height: 50, width: 300
                   onValueChange=(TextInputValue, itemIndex) =>
                   this.setState(section: TextInputValue)>
                     <Picker.Item label = "Select Section" />
               <Picker.Item label = "Meat" value = "Meat" />
               <Picker.Item label = "Vegetable" value = "Vegetable" />
               <Picker.Item label = "Fruits" value = "Fruits" />
               <Picker.Item label = "Biscuits" value = "Biscuits" />
               <Picker.Item label = "Condiments" value = "Condiments" />
               <Picker.Item label = "Canned Goods" value = "Canned Goods" />
               <Picker.Item label = "Drinks" value = "Drinks" />

               <Picker.Item label = "Diapers/Napkin" value = "Diapers/Napkin" />
               <Picker.Item label = "Frozen Products" value = "Frozen Products" />
               <Picker.Item label = "Junk Foods" value = "Junk Foods" />
               <Picker.Item label = "Milk" value = "Milk" />
               <Picker.Item label = "Soap/Shampoo" value = "Soap/Shampoo" />
               <Picker.Item label = "Pesonal Items" value = "Pesonal Items" />
               <Picker.Item label = "Pasta/Noodleslete" value = "Pasta/Noodles" />




            </Picker>


<TextInput

   placeholder="Enter Description"
   multiline=true
   numberOfLines=4
   label="Enter Product"
   value=this.state.Description
   onChangeText=Description => this.onChangeTitle(Description)                
   underlineColorAndroid='transparent'

   style=styles.TextInputStyleClass
 />


 <TextInput

   placeholder="Enter image"
   value= photo 
   onChangeText=image => this.onChangeTitle(image) 
   underlineColorAndroid='transparent'

   style=styles.TextInputStyleClass
 />
 <TouchableOpacity onPress=selectPhotoTapped style=styles.uploadButton>
          <Text style=styles.uploadButtonText>Upload</Text>
        </TouchableOpacity>

<TouchableOpacity activeOpacity =  .4  style=styles.uploadButton >

  <Text style=styles.TextStyle> INSERT PRODUCT TO SERVER </Text>

</TouchableOpacity>

<TouchableOpacity activeOpacity =  .4  style=styles.uploadButton  >

  <Text style=styles.TextStyle> SHOW ALL INSERTED PRODUCTS RECORDS</Text>

</TouchableOpacity>
<TouchableOpacity activeOpacity =  .4   >

  <Text style=styles.TextStyle>    </Text>

</TouchableOpacity>
</KeyboardAvoidingView>
        </ScrollView>

      </View>

    </View >
  );
;




export default App;

const styles = StyleSheet.create(
  imageContainer: 

    height: Dimensions.get('window').height
  ,
  backgroundImage: 
    flex: 1,
    resizeMode: 'cover',
  ,
  uploadContainer: 
    backgroundColor: 'white',
    borderTopLeftRadius: 45,
    borderTopRightRadius: 45,
    position: 'absolute',
    bottom: 0,
    width: Dimensions.get('window').width,
    height: 200,
  ,
  uploadContainerTitle: 
    alignSelf: 'center',
    fontSize: 25,
    margin: 20,
    fontFamily: 'Roboto'
  ,
  uploadButton: 
    borderRadius: 16,
    alignSelf: 'center',
    shadowColor: "#000",
    shadowOffset: 
      width: 7,
      height: 5,
    ,
    shadowOpacity: 1.58,
    shadowRadius: 9,
    elevation: 4,
    margin: 10,
    padding: 10,
    backgroundColor: '#fe5b29',
    width: Dimensions.get('window').width - 60,
    alignItems: 'center'
  ,
  uploadButtonText: 
    color: '#f6f5f8',
    fontSize: 20,
    fontFamily: 'Roboto'
  ,

  MainContainer :

    alignItems: 'center',
    flex:1,
    paddingTop: 30,


  ,

  MainContainer_For_Show_StudentList_Activity :

    flex:1,
    paddingTop: (Platform.OS == 'ios') ? 20 : 0,
    marginLeft: 5,
    marginRight: 5

    ,

  TextInputStyleClass: 

  textAlign: 'center',
  width: '90%',
  marginBottom: 7,
  height: 40,
  borderWidth: 1,
  borderColor: '#FF5722',
  borderRadius: 5 ,

  ,

  TouchableOpacityStyle: 

    paddingTop:10,
    paddingBottom:10,
    borderRadius:5,
    marginBottom:7,
    width: '90%',
    backgroundColor: '#00BCD4'

  ,

  TextStyle:
    color:'#fff',
    textAlign:'center',
  ,

  rowViewContainer: 
    fontSize: 20,
    paddingRight: 10,
    paddingTop: 10,
    paddingBottom: 10,
  ,
);

【问题讨论】:

【参考方案1】:
    返回应该包含您的 JSX 代码以返回Something。 您当前的返回包含 JSX 代码,但它都在您的 AddPost 类下,而您的 App 函数没有任何可返回的内容。 您正在使用用于功能组件的 useState 和用于组合类组件的 setState。我建议您在项目中一次只使用一种类型的组件,以使您的代码更简单、更好。

为了完成这项工作,我建议您应该在 App 的 return 下添加您的 AddPost 类。

例如

const App = (props) => 
//somewhere here 
return(
//only if this is your initial file
//else import other file and write followingly
<AddPost/>
)

export default App;

【讨论】:

以上是关于不变违规:App(...) 渲染没有返回任何内容。这通常意味着缺少 return 语句。反应原生的主要内容,如果未能解决你的问题,请参考以下文章

React - 错误:App(...):渲染没有返回任何内容。这通常意味着缺少 return 语句。或者,不渲染任何内容,返回 null

错误 [React Native]:渲染没有返回任何内容

不变违规:元素类型在 createMaterialTopTabNavigator()/MaterialTopTabView 渲染方法中无效,React Native w/React Navigatio

错误:应用程序(...):渲染没有返回任何内容。这通常意味着缺少返回语句 discord.js react typescript

带有整数查询参数的 RelayJS 不变违规

测试套件无法运行。不变违规:_registerComponent(...):目标容器不是 DOM 元素