Home > Net >  react native modal inside FlatList not working
react native modal inside FlatList not working

Time:10-08

...i'm getting issues inreact native modal click change flatlist text.

i want when i click on modal ok button accept text in flatlist changes to pending

here is my code ...

...i'm getting issues inreact native modal click change flatlist button color.

i want when i click on modal ok button accept text in flatlist changes to pending

here is my code ...

... im new to react native i try it many times to solve but fail please help...

  import React from 'react';
import { SafeAreaView, View, FlatList,Pressable, StyleSheet, Text, StatusBar } from 'react-native';

const DATA = [
  {
    id: 'bd7acbea-c1b1-46c2-aed5-3ad53abb28ba',
    title: 'First Item',
  },
  {
    id: '3ac68afc-c605-48d3-a4f8-fbd91aa97f63',
    title: 'Second Item',
  },
  {
    id: '58694a0f-3da1-471f-bd96-145571e29d72',
    title: 'Third Item',
  },
];



const App = () => {
   const [active, setactive] = useState(false);

  const renderItem = ({ item }) => (
    <View style={styles.item}>
    <Text style={styles.title}>{title}</Text>
   <Pressable  onPress={() => setactive(!active)}>
        <Text>accept</Text>
   </Pressable>

  </View>
  );

  return (
    <SafeAreaView style={styles.container}>
      <FlatList
        data={DATA}
        renderItem={renderItem}
        keyExtractor={item => item.id}
      />
 <Modal
        animationType="slide"
        transparent={true}
        visible={active}
        onRequestClose={() => {
          setDetails(null)
          console.warn("closed");
        }}>
    <Pressable  onPress={() => [handleListing(), setactive(!active)]}>
         <Text>ok</Text>
         </Pressable>
   </>Modal
    </SafeAreaView>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    marginTop: StatusBar.currentHeight || 0,
  },
  item: {
    backgroundColor: '#f9c2ff',
    padding: 20,
    marginVertical: 8,
    marginHorizontal: 16,
  },
  title: {
    fontSize: 32,
  },
});

export default App;

CodePudding user response:

I didn't get exactly but as far as i understand you're trying to do this;

Change accept text with this line:

 <Text>{modalOkPressed ? "Pending" : "accept"}</Text>

then add this usestate below "active-setactive"

const [modalOkPressed, setModalOkPressed] = useState(false)

then replace pressable line which contains "ok" with this line;

<Pressable onPress={() => [setactive(!active), setModalOkPressed(true)]}>

now when u press to "Ok", "modalOkPressed will be equal to true and text will be "pending" instead of "accept".

You may use if else statement in one line like this:

{modalOkPressed ? "Pending" : "accept"}

CodePudding user response:

Here is my result: I think the @Emre özcan's result is correct. The current code is working with maintaining your original code as much as possible. I only arranged them.

import React from 'react';
import { SafeAreaView, View, FlatList,Pressable, StyleSheet, Text, StatusBar } from 'react-native';

const DATA = [
  {
    id: 'bd7acbea-c1b1-46c2-aed5-3ad53abb28ba',
    title: 'First Item',
  },
  {
    id: '3ac68afc-c605-48d3-a4f8-fbd91aa97f63',
    title: 'Second Item',
  },
  {
    id: '58694a0f-3da1-471f-bd96-145571e29d72',
    title: 'Third Item',
  },
];

const App = () => {
   const [active, setactive] = useState(false);
   const [modalOkPressed, setModalOkPressed] = useState(false);

  const renderItem = ({ item }) => (
    <View style={styles.item}>
    <Text style={styles.title}>{title}</Text>
    <Pressable onPress={() => {
        setactive(!active);
    }}>
        <Text>
           {modalOkPressed ? "Pending" : "accept"}
        </Text>
   </Pressable>

  </View>
  );

  return (
    <SafeAreaView style={styles.container}>
      <FlatList
        data={DATA}
        renderItem={renderItem}
        keyExtractor={item => item.id}
      />
      <Modal
        animationType="slide"
        transparent={true}
        visible={active}
        onRequestClose={() => {
          setDetails(null)
          console.warn("closed");
        }}>
      <Pressable  onPress={() => {
        handleListing();
        setactive(!active);
        setModalOkPressed(true);
      }}>
         <Text>ok</Text>
         </Pressable>
      </Modal>
    </SafeAreaView>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    marginTop: StatusBar.currentHeight || 0,
  },
  item: {
    backgroundColor: '#f9c2ff',
    padding: 20,
    marginVertical: 8,
    marginHorizontal: 16,
  },
  title: {
    fontSize: 32,
  },
});

export default App;

CodePudding user response:

I guess I understood, you can add extradata to flatlist;

create a state called selectedIndex (or whatever u want) and set the value of selectedIndex with onPress Function,

We have unique id's in data so we can set selectedIndex(item.id) then create single line if else statement to check if our selected(pressed) id is equal to selectedIndex and then return text according to it

Can you try this code now ?

const App = () => {
const [active, setactive] = useState(false);
const [selectedIndex, setSelectedIndex] = useState(null)

const renderItem = ({ item }) => (
    <View style={styles.item}>
        <Text style={styles.title}>{item.title}</Text>
        <Pressable onPress={() => {
            setactive(!active);
            setSelectedIndex(item.id);
        }}>
            <Text>
                {selectedIndex === item.id ? "Pending" : "Accept"}
            </Text>
        </Pressable>

    </View>
);
return (
    <SafeAreaView style={styles.container}>
        <FlatList
            data={data}
            renderItem={renderItem}
            keyExtractor={item => item.id}
            extraData={selectedIndex}    // add extra data to flatlist
        />
        <Modal
            style={styles.modal}
            animationType="slide"
            transparent={true}
            visible={active}
            onRequestClose={() => {
                setDetails(null)
                console.warn("closed");
            }}>
            <Pressable onPress={() => {
                handleListing();
                setactive(!active);
            }}>
                <Text>Ok</Text>
            </Pressable>
        </Modal>
    </SafeAreaView>
);}
  • Related