Flatlist не обновляется в реакции родного - PullRequest
0 голосов
/ 16 мая 2019

Я хочу обновить свой плоский список после получения базы данных. но это не обновление ниже мой код. Я получаю данные из FireBase и помещаю в массив. и когда я вызываю этот массив, данные не были найдены. Как я могу это исправить? Я знаю, что этот код глуп. но, пожалуйста, помогите ...

импорт React из 'реакции'; import {StyleSheet, Text, View, StatusBar, Image, ScrollView, TouchableOpacity, SafeAreaView, TextInput} из'act-native ';

      import * as firebase from "firebase";
      import Geolocation from "react-native-geolocation-service";
      import geolib from "geolib";
      import Permissions from "react-native-permissions";
      import Share from "react-native-share";
      import RNFetchBlob from "react-native-fetch-blob";
      let base_64;

      //===================card view========================
      var data = [];
      var data1 = [];
      var i = 0;
      let coordsLat;
      let coordslon;
      let Geoposition = 0;

      let dist1;
      let geolat = 51.525;
      let geolon = 51.525;
      Number(geolat);
      Number(geolon);
      const formatData = (data, numColumns) => {
        const numberOfFullRows = Math.floor(data.length / numColumns);

        let numberOfElementsLastRow = data.length - numberOfFullRows * numColumns;
        while (
          numberOfElementsLastRow !== numColumns &&
          numberOfElementsLastRow !== 0
        ) {
          data.push({ key: `blank-${numberOfElementsLastRow}`, empty: true });
          numberOfElementsLastRow++;
        }

        return data;
      };

      const numColumns = 4;
      //====================================================
      var itm = [];
      var arr =[

          'https://firebasestorage.googleapis.com/v0/b/taam-623b6.appspot.com/o/Circles%2FGroup-615.png?alt=media&token=23e9c5dc-16f3-426e-b1ce-68c35fd145b2',
          'https://firebasestorage.googleapis.com/v0/b/taam-623b6.appspot.com/o/Circles%2Fgroupgre.png?alt=media&token=5a280580-8c4b-4aef-83c4-4626174b04fa',
          'https://firebasestorage.googleapis.com/v0/b/taam-623b6.appspot.com/o/Circles%2Folivegreen.png?alt=media&token=dc72ce64-e794-4aab-a0a9-54f134d0d5dd',
          'https://firebasestorage.googleapis.com/v0/b/taam-623b6.appspot.com/o/Circles%2Forange.png?alt=media&token=4631ff27-26d6-4d19-9370-40893d15af8f',
          'https://firebasestorage.googleapis.com/v0/b/taam-623b6.appspot.com/o/Circles%2Fteal.png?alt=media&token=7522aea2-02c4-4f13-9cb4-e7d43ce684e9',
          'https://firebasestorage.googleapis.com/v0/b/taam-623b6.appspot.com/o/Circles%2Fyellow.png?alt=media&token=6375fd68-fd93-40b8-a989-aef0e96e10ff'
        ];
        var value;
        let items = [];
      export default class temp extends React.Component {

        constructor(props) {
          super(props);

          this.state = {
            items: [],
            calltimer: true,
            search: "",
            loadsearchresult: false, //not used yet
            update: "",
            locationPermission: "",
            datalist:[]
          };
        }
        componentWillMount() {
          Permissions.check("location").then(response => {
            // Response is one of: 'authorized', 'denied', 'restricted', or 'undetermined'
            this.setState({ locationPermission: response });
          });

          //this.geolocation();
          this.fetchData();

        }

        fetchData = async () => {

          var i=0;
          let stop=false;
          this.setState({ loading: true });
          console.log("savad");
          //========================================
          firebase
            .database()
            .ref("/Brands/")
            .on("value", snap => {

                //-------------------------------------------

                snap.forEach(brand =>{
                    stop=false;

                    firebase.database().ref("/flyers/").on("value", snap=>{
                          snap.forEach(flyer =>{
                              if(stop==false){

                          if (brand.val().Name=== flyer.val().BrandName){

                //////////////////////////////////////////////////////////////////
                Geolocation.getCurrentPosition(position => {

                    geolat = flyer.val().latitutde;
                    geolon = flyer.val().longitude;
                    dist1 =
                      geolib.getDistance(position.coords, {
                        latitude: geolat,
                        longitude: geolon
                      }) / 1000;
                      if (dist1 < 50000) {
                          items.push({

                                      Name:brand.val().Name,
                                      ImageUrl:brand.val().ImageUrl,
                                      Circle:value = arr[Math.floor(Math.random() * arr.length)]
                                      })
                                  //stop=true;

                                  data=items;

                                  this.setState({datalist:items})
                                  alert(JSON.stringify(items))


                      }

                });
                /////////////////////////////////////////////////////////////////

                          }

                          }
                          })
                    })






                  //----------------------------------------------



                })


              itm = items;

              this.setState({ loading: false });
              this.setState({ items: items });


            });

            this.setState({update:' '})
          //=========================================
        };
        //=======================================================

        //-------------------------------logout----------------------------------
        logout() {
          Alert.alert("Logout", "Do You Want to Logout", [
            {
              text: "Cancel",
              onPress: () => {},
              style: "cancel"
            },
            {
              text: "OK",
              onPress: () => {
                AsyncStorage.removeItem("user");
                this.props.navigation.navigate("Login");
              }
            }
          ]);
        }

        //===========================card view=====================
        renderItem = ({ item, index }) => {
          if (item.empty === true) {
            return <View style={[styles.item, styles.itemInvisible]} />;
          }
          {

          }


          return (
            <View key={index} style={styles.item}>

              <View key={index} style={styles.imagecontainer}>

                <TouchableNativeFeedback
                  onPress={() =>
                    this.props.navigation.navigate("FlyerListing1", {
                      PassedName: item.Name,
                      //PassedCircleUrl:item.Circle,
                      PassedImageUrl:item.ImageUrl,
                      Paramnav: "FlyersNearBy"
                    })
                  }
                >
                <View style={{ width: "90%", height: "70%", marginTop:"25%", marginLeft:15, borderRadius: 100}}>
                  <ImageBackground
                    key={index}
                    style={{ width: "90%", height: "90%", marginTop:"25%" }}
                    source={{ uri:item.Circle}}

                  >

                {/* ------------SocialMediaShare------------------ */}

                  <View  style={{ width: "50%", height: "50%", marginLeft:"22%", marginTop:"25%"}}>
                  <Image
                    key={index}
                    style={{ width: "90%", height:"90%",resizeMode:"contain",justifyContent:'center',alignItems:'center'}}
                    source={{uri:item.ImageUrl}}
                  />

                  </View>
                  {/* ------------------------------------------ */}
                  </ImageBackground></View>
                </TouchableNativeFeedback>

              </View>
              <View style={{marginLeft:-1,marginTop:-5,alignItems: 'center', justifyContent: 'center',}}>
              <Text key={index} style={styles.itemText}>
              {item.Name}
              </Text>
              </View>
            </View>
          );
        };

        //=========================================================




        render() {

          {this.state.update}
          return (
            <SafeAreaView style={styles.first}>
            <View style={styles.second}>

              <StatusBar hidden />
              <View Style={styles.third}>
              </View>
              <View style={styles.fourth}>
              <TouchableOpacity>
                    <Image
                      style={styles.fifth}
                      source={require("../src/Assets/Icons/drawable-xxxhdpi/Path_375.png")}
                    />
                  </TouchableOpacity>
                <View>
                <Image style={styles.sixth} source={require('../src/Assets/logo.png')} />
                </View>
                <TouchableOpacity onPress={() => this.logout()}>
                    <Image
                      style={styles.fifth1}
                      source={require("../src/Assets/Icons/drawable-xxxhdpi/logout.png")}
                    />
                  </TouchableOpacity>
              </View>

              <ScrollView vertical={true} style={styles.container}>

              <View style={styles.seventh}>
                  <View style={styles.eighth}>
                    <TouchableOpacity style={styles.ninth}>
                      <Image
                        style={styles.eleventh}
                        source={require("../src/Assets/Search.png")}
                      />
                    </TouchableOpacity>
                    <View style={styles.twelth}>
                      <TouchableOpacity
                        onPress={() =>
                          this.props.navigation.navigate("Search", {
                            Paramnav: "FlyersNearBy"
                          })
                        }
                      >
                        <TextInput
                          underlineColorAndroid="transparent"
                          placeholder="Search                               "
                          onChangeText={search => this.setState({ search })}
                          onFocus={() =>
                            this.props.navigation.navigate("Search", {
                              Paramnav: "FlyersNearBy"
                            })
                          }
                        />
                      </TouchableOpacity>
                    </View>

                  </View>

                </View>

                <View style={styles.seventeenth}>
                    <TouchableOpacity style={styles.eighteenth} onPress={() => this.props.navigation.navigate("SuperMarket1")}>
                    <Image style={styles.ninteenth}source={require('../src/Assets/Group256.png')} />
                    </TouchableOpacity>
                    <TouchableOpacity style={styles.twenty}>
                    <Image style={styles.twenty1} source={require('../src/Assets/Group257.png')} />

                    </TouchableOpacity>
                </View>
                <View style={styles.twenty2}>
                <Image style={styles.twenty3}source={require('../src/Assets/PageTitle-3.png')} />
                </View>
                <FlatList
                    data={formatData(data, numColumns)} //data={formatData(data, numColumns)}
                    style={styles.container1}
                    renderItem={this.renderItem}
                    numColumns={numColumns}
                  />

              </ScrollView>
              <View style={styles.thirty4}>
                    <TouchableOpacity>
                      <Image style={styles.part} source={require('../src/Assets/home-button.png')} />
                    </TouchableOpacity>

                  </View>
            </View>
            </SafeAreaView>
          );
        }
      }

1 Ответ

0 голосов
/ 16 мая 2019

Вы напрямую изменяете состояние, вызывая push в экземпляре массива. Таким образом, функция рендеринга не будет обновляться (повторно рендерить) при изменении состояния. Убедитесь, что вы не мутируете государством

...