Flatlist vs map callback columns in React native - react-native

I am trying to show a bunch of images in rows of 3 images and using Flatlist i got this error "Can't perform a React state update on an unmounted component". I tried everything about using an unmount flag but the problem still persists.
However, noticed that with the map() callback function that problem doesn't exist. The problem is how to create A View with map() in order to render 3 images at each row. Is there a possible way to create a View with 3 columns using map()?

If your problem is "The problem is how to create A View with map() in order to render 3 images at each row." then i'll answer your question with a .map() answer instead of a flatlist answer.
For .map() it will render as many images as there are in the array that you've called .map on. The spacing in that scenario is moreso done by the container you've wrapped it in, plus you can give each image a width of '33%'. Meaning, you'll want something like this:
<View style={{flexDirection: 'row', flexWrap: 'wrap'}}>
{YOURARRAY.map(() => {
return(
---- your image with the style {width: '33%'} here ----
)}
<View>

Related

Setting key for Swiper React Native

I have a Swiper implemented in my react native project (react-native-swiper), which I plan to show data along with pagination guides. While the swiper is working, I'm having an issue creating a consistent key - right now if one of the objects in the swiper list updates it may offset the index. While I've been able to prevent such glitches by adding a unique key on the objects, the Swiper pagination however is not in sync. The former key gets its data from mapping the list, but the Swiper object is on the outer scope so it's not able to use that identifier. I've attached the code for reference. Please let me know if I can set a key that ensures stable changes and correct pagination. Thank you.
<Swiper
key={data.length} //This is the key that enables correct pagination currently
paginationStyle={{bottom: -20}}
height={330}
dot={<View style={styles.Dot} />}
activeDot={<View style={styles.ActiveDot} />}
>
{data.map((dataX, index) => {
return (
<View key={dataX.uniqueToken}> //This (or the index) is the key I'd like to use on the Swiper element
... stuff to show images, etc.
</View>
)
})}
</Swiper>
You can try use index as a key value, I always using index and no problem

Huawei Cluster Map and View Marker

I am creating a project in React Native for Huawei and i use this library: "#hmscore/react-native-hms-map".
When creating the map, how can I place the view inside the markup?
In MapView I can put inside and draw anything, however in HMSMarker it doesn't allow me, is there a way?
Groups only join when there are at least 6 marks together, is there a way to make groups of 2 marks together?
Thank you very much in advance.
Marker can be customized in icon mode:
You can find the parameter description here:
https://developer.huawei.com/consumer/en/doc/development/HMS-Plugin-References/marker-0000001051150162#section8565252375
And the sample code:
<HMSMarker
icon={{
uri: Image.resolveAssetSource(
require("../assets/galata-tower.png")
).uri,
width: 140,
height: 150,
}}
>
The min marker number in cluster cannot be changed.
If you want to set title and snippet for the marker, it is supported like :
Or you can define a InfoWindow.
But if you want to define the view of the marker, you cannot use "View" directly.

How to pass the acquired ID param into a variable - React Native

I am using axios to make several http request simultaneously. Like so:
Afterwards I create a helper function called renderMoviesTrending() to show the data acquired from the api
As you can see from the screenshot, I am passing the movie id (movieTrending.id) via a onPress to the function onPressPosterTrending. This allows me to pass the data of a single selected movie along to movieDetails.js. (all this works fine)
The issue that I am facing now is I need to make a new api call where I must place the movieTrending.id in it, to retrieve a new set of data that allows me to play trailers for a chosen movie based of of the movie id.
The new url for that http request for retrieving the data concerning trailers is the following -> https://api.themoviedb.org/3/movie/353486/videos?api_key=2e3b3e231665535756b50c3e216e0467
Where the api data looks like this:
So when I create a new helper function to make that http request, how to get the movie id from the previous function into the url ?
UPDATED Code of my app.js
https://gist.github.com/anonymous/84107c7d295a848fbe1102b6df9ee8f5
I hope you guys understand what I am trying to achieve here. I have googled this but not really found anything. Maybe I am searching on the wrong keywords
Any help is much appreciated
I feel the easiest way is just storing the current movie trending ID in the state as a new variable. That way it will be available for the whole component.
You are actually already storing the current trending movie.
You can just access it with this.state.selectedMovieTrending.
So your url becomes: https://api.themoviedb.org/3/movie/{this.state.selectedMovieTrending}/videos?api_key=2e3b3e231665535756b50c3e216e0467
Or 'https://api.themoviedb.org/3/movie/' + this.state.selectedMovieTrending + '/videos?api_key=2e3b3e231665535756b50c3e216e0467
use flatlist from react native
like this
<FlatList
data={this.props.posts}
keyExtractor={(item, index) => item._id}
renderItem={({item}) =>{
return(
<View >
<TouchableHighlight onPress={() => this.props.navigation.navigate('SingleMovieScree',{movieid:item.id})} >
// Use React navigation to nvaigate to another screen
<Image style={styles.Poster} source={{ uri: `${TMDB_IMG_URL}${(movieTrending.poster_path)}` }} />
</TouchableHighlight>
</View>
)
}
}
/>
so on another screen you will get movie id parameter like this
console.log(this.props.navigation.state.params.movieid);
then use this id to get movie details from request and display in your screen

Stuck on "unique key" warning

I'm currently adapting a Mobx tutorial for a to-do app. link
What I want to do is add a simple counter button to each rendered list item. I figured this would be pretty simple, but I must be making a syntactical error because I cannot get things to mesh properly. The main error I'm getting right now is that "Each child in an array or iterator must have a unique 'key' property". I figured I would solve this by adding in a uuid to each counter(the counter is what cause the error to begin appearing). Alas, I cannot seem to find a solution.
Here is the github repository for the app: https://github.com/Darthmaul/UmCount
Specifically this file is the one that has received the most modifications. I also added a "counterstore.js" file to keep the store of the counter intact(which seems to be failing).
Any help would be appreciated. At this point I just don't know what's wrong and what's right.
Thanks,
Andrew
When you have a component which has an array of children, each of which might have its own children, not only the top-level children but also each child at a deeper level needs its own key.
The problem with doing
const Items = ({items}) => (
<View style={{flex: 1, paddingTop: 10}}>
{items.map((item, i) => {
return (<View>
<Text style={styles.item} key={i}>• {item} - {store.counter}</Text>
<Button onPress={() => store.increment()} title="+1" color="#50EB5D" key={uuid()} />
</View>
)})
}
</View>
)
is that your Text and Button components have keys, but your Views do not.
React uses keys for reconciliation and finding the minimal change whenever a list of components changes. How you set keys here will affect the reconciliation policy when your array changes: You can set your View, Text and Button for each array element to have the same key if you know that whenever one of them changes, the entire row changes, but if each of them changes separately, then you should generate a unique ID for each of them.
React docs on reconciliation and keys.

React Native: Z Index on selection

There have been a lot of posts regarding z index and layer ordering but none with much of a solution. Its easy enough to layer things as you need, but if you need dynamic layer re-ordering it becomes a problem. Like for example I have four moveable elements, when one is selected it should move above the others but they are already in set order so each moves under the other.
If they are layered in render order than how can the active item move to the front and move above the other three?
You may solve this by changing the rendering order of your components. Lets say you have some items you want to render in an array and an index of the selected item, so your render method may look like this:
render() {
const items = ....;
const selectedIndex = ...;
return (
<View>
{items.filter((item, index) => index != selectedIndex)}
{items[selectedIndex]}
</View>
);
}
This way your selected item would always render last and be on top of the others.