设置!
我可以在聊天中动态加载图像-类似于仅包含文本消息或图像和文本消息的界面。目前,我正在使用它从存储在Firebase存储中的外部URL加载图像,其中元数据CacheControl设置为允许图像缓存。
我正在通过一个标准的标准本机库中的图像来显示图像。我正在做的一件事很奇怪,就是有条件地基于平面列表数据中的状态添加组件。示例:
ImageOrViewMessages = (props) => {
if(item != null && item.image != ''){
return (
<View>
<Image source={{uri: item.image, cache: "force-cache"}} style={{display: 'flex', height: 300, flex: 1, padding: 5}} />
</View>
)
} else {
return(
<View style={{display: 'none'}}></View>
)
}
}
这是我的单位列表:
<FlatList
data={this.props.unsent_messages.length > 0 && this.props.chat != '' ? this.props.unsent_messages.concat(this.props.messages) : this.props.messages}
renderItem={({item}) => {
var align_text = "flex-end"
var background_color = colors.main_color_light;
var text_color = "white"
var stamp = "none"
if(item.username.toLowerCase() != this.props.displayName.toLowerCase()){
//do something differ
align_text = "flex-start"
background_color = colors.main_color_dark;
text_color = "white"
stamp = "flex"
}
ImageOrViewMessages = (props) => {
if(item != null && item.image != ''){
return (
<View>
<Image source={{uri: item.image, cache: "force-cache"}} style={{display: 'flex', height: 300, flex: 1, padding: 5}} />
</View>
)
} else {
return(
<View style={{display: 'none'}}></View>
)
}
}
return(
<View style={{padding: 5, minHeight: 70, alignItems: align_text, justifyContent: "center"}}>
<View style={{opacity: item.id.toString().includes("Unset") ? .3 : 1, backgroundColor: background_color, padding: 5, borderWidth: 0, borderColor: colors.border_color,borderRadius: 8 , width: (Dimensions.get('window').width / 2) - 10, alignSelf: align_text}}>
<Text style={{fontFamily: "MarkerFelt-Thin", color: text_color, fontSize: 16, textAlign: "left", flex: 1}}>{item.message}</Text>
{/* <Text style={{display: stamp, fontFamily: "MarkerFelt-Thin", color: colors.background_color, fontSize: 14, textAlign: "right", flex: 1}}>{item.username}</Text> */}
<ImageOrViewMessages />
</View>
</View>
)}
}
keyExtractor={item => item.image != '' ? item.image : item.id.toString()}
style={{display: 'flex', flex: 1, borderTopLeftRadius: 25, borderTopRightRadius: 25}}
ref={ref => this.flatList = ref}
inverted={true}
/>
问题!
图像可以完美呈现,但是每一次它们都必须从我的服务器下载,而不是存储在缓存中。我尝试执行的操作是确保正确设置上载图像上的元数据。通过Image属性“ Cache”强制缓存。我确保为列表中的每个项目都设置了唯一的密钥,包括通过密钥提取器提取的图像。 我也可以将图像缓存在主页上而不会出现任何问题(当它不再出现在列表中时)
答案 0 :(得分:1)
是的,每次都会从服务器重新渲染图像。您需要在默认应用程序或设备内存中缓存图像。最好的方法是FastImage进行延迟加载。
将图片加载替换为以下内容之一:
<FastImage
style={styles.image}
source={{
uri: YOUR_IMAGE_URL,
priority: FastImage.priority.normal,
}}
resizeMode={FastImage.resizeMode.contain}
/>
不要忘记导入FastImage。
import FastImage from 'react-native-fast-image'