#image #react-native #uri
#изображение #react-native #uri
Вопрос:
Я разрабатываю приложение для Iphone с использованием React Native.Я хочу отобразить массив изображений на экране. Ниже приведен код: Download.js
import React,{useEffect, useState} from 'react';
import { View, StyleSheet,Text ,FlatList,ActivityIndicator,Image} from 'react-native';
import { useSelector,useDispatch} from 'react-redux';
import * as downloadActions from '../../store/actions/download';
const DownloadPage = props =>{
const image = useSelector(state => state.download.availableImages);
const [isLoading,setIsLoading] = useState(false);
const dispatch = useDispatch();
useEffect(() => {
const loadImage = async ()=>{
setIsLoading(true);
await dispatch(downloadActions.filedownload());
setIsLoading(false);
//setIsLoading(true);
};
loadImage();
},[dispatch]);
if(isLoading){
return <View>
<ActivityIndicator size='large'/>
</View>
}
return(
<View style={styles.MainContainer}>
<FlatList
data={ image }
renderItem={({item}) =>
<View style={{flex:1, flexDirection: 'row'}}>
<Image source = {{ uri: item.GCP_Image}} style={styles.imageView} />
</View>
}
keyExtractor={(item, index) => index.toString()}
/>
</View>
)}
const styles = StyleSheet.create({
MainContainer :{
justifyContent: 'center',
flex:1,
margin: 5,
marginTop: (Platform.OS === 'ios') ? 20 : 0,
backgroundColor: 'green'
},
imageView: {
width: '50%',
height: 100 ,
margin: 7,
borderRadius : 7
},
textView: {
width:'50%',
textAlignVertical:'center',
padding:10,
color: '#000'
}
});
export default DownloadPage;
С помощью API я получил следующий массив:
Array [
Image {
"GCP_Image": Array [
"https://storage.googleapis.com/...../1602863214485.jpg",
"https://storage.googleapis.com/...../0Ay3P4AVObQ8csHgAFk5.mp4",
"https://storage.googleapis.com/...../1LNQQmtjEm4apPp4VK6u.jpg"
]
Все эти изображения являются допустимыми URL-адресами.
Если я передам массив в источник изображения с помощью {item .GCP_Image} отображается только первое изображение.Когда я передаю этот массив в uri изображения, я получаю следующую ошибку: Предупреждение: сбой типа реквизита: недопустимый реквизит source
, предоставленный Image
.
Не могли бы вы помочь мне, где я ошибаюсь. Заранее спасибо.
Ответ №1:
Свойство Image source
принимает что-то типа ImageURISource
или массив ImageURISource
‘s. Так что попробуйте:
Array [
Image {
"GCP_Image": Array [
{uri: "https://storage.googleapis.com/...../1602863214485.jpg"},
{uri: "https://storage.googleapis.com/...../0Ay3P4AVObQ8csHgAFk5.mp4"},
{uri: "https://storage.googleapis.com/...../1LNQQmtjEm4apPp4VK6u.jpg"}
]
Это массив ImageURISource
Комментарии:
1. Я мог бы отправить следующие данные API, как вы сказали выше: Array [ Image { «GCP_Image»: Array [ Object { «uri»: » storage.googleapis.com/…../IphoneImg-1602863214485.jpg «, },Объект { «uri»: » storage.googleapis.com/…../IphoneImg-1602863214486.jpg «, }]}]. После запуска этого я получаю сообщение об ошибке: значение JSON ‘{uri = » storage.googleapis.com/…../IphoneImg-1602863214485.jpg «}’ типа NSMutableDictionary не может быть преобразован в допустимый URL. Есть какие-либо мысли об этом. Я все еще пытаюсь…
2. с изображением как GCP_Image[0]}}/>
3. попробуйте
<Image source={itemData.item.GCP_Image[0]}/>
Ответ №2:
Поскольку ваши данные, возвращаемые из вашего api, имеют предопределенную форму, вы можете предоставить массив изображений в свой FlatList, как показано ниже. Потому что GCP_Image имеет фактические URI изображения в качестве приемлемого массива.
<FlatList
data={image[0].GCP_Image} ...
/>
И в вашей функции renderItem вам необходимо указать item
в качестве исходного uri
renderItem = {({item}) =>
<View style={{flex:1, flexDirection: 'row'}}>
<Image source = {{ uri: item}} style={styles.imageView} />
</View>}