问题描述
我需要从互联网下载文件,为此我使用的是 react-native-background-downloader。 我正在使用 [recyclerlistview][1] 来显示列表数据。里面的列表我有进度条。问题是即使在更新值后进度条也不显示进度。这是我的代码
const dataProviderMaker = (data) => new DataProvider((r1,r2) => r1 !== r2).cloneWithRows(data)
const App= (props) => {
const [dataProvider,setDataProvider] = useState(dataProviderMaker({}))
const _layoutProvider = useRef(layoutMaker()).current
const [data,setData] = useState({})
const NOT_DOWNLOADED = 0
const DOWNLOADING = 1
const DOWNLOADED = 2
const fetchContent = async () => {
try {
await fetch(url,{ method: 'GET'},)
.then((response) => response.json())
.then((resData) => {
if (resData.error) {
return
}
resData.map((d) => addkeyvalue(d,'icon',false))
resData.map((d) => addkeyvalue(d,'progress',0))
resData.map((d) => addkeyvalue(d,'offline',NOT_DOWNLOADED))
setDataProvider(dataProviderMaker(resData))
setData(resData)
})
} catch (e) {
alert('Network problem. Check your internet connection')
}
}
const addkeyvalue = (obj,key,data) => { obj[key] = data }
const downloadFile = (da) => {
var item = data.findindex((x) => x.ID == da.ID)
var d = [...data]
da.offline = DOWNLOADING
d[item] = da
setData(d)
let task = RNBackgroundDownloader.download({
id: da.ID,url: da.FILE_URL,destination: `${RNBackgroundDownloader.directories.documents}/video`
}).begin((expectedBytes) => {
console.log(`Going to download ${expectedBytes} bytes!`)
}).progress((percent) => {
console.log(`Downloaded: ${percent * 100}%`)
da.progress = percent
d[item] = da
setData(d)
}).done(() => {
da.progress = 1
da.offline = DOWNLOADED
d[item] = da
setData(d)
}).error((error) => {
console.log('Download canceled due to error: ',error);
})
}
useEffect(() => { fetchContent() },[])
useEffect(() => {
setDataProvider(dataProviderMaker(data))
},[data])
return (
<View>
<RecyclerListView
layoutProvider={_layoutProvider}
dataProvider={dataProvider}
roWrenderer={roWrenderer}
/>
</View>)
}
这是 roWrenderer
const roWrenderer = (type,d) => {
return (
<CellContainer style={{ flexDirection: 'row',borderBottomColor: '#424242',borderBottomWidth: 0.3,}}>
<TouchableOpacity style={styles.listContainer} onPress={() => navigate(data)}>
<Image style={{ borderRadius: 4,height: 60,margin: 4,padding: 4,width: 80,}} source={require('../../asset/videologo.jpg')} />
<View style={{ flex: 1,flexDirection: 'column',justifyContent: 'space-between',}}>
<ProgressBar progress={d.progress} color="#8446b3" />
</View>
</TouchableOpacity>
<TouchableOpacity style={{ flex: 1,justifyContent: 'center',alignItems: 'center',}}
onPress={() => {
downloadFile(d)
}}>
<Icon name='download-circle' size={30} color="#898989" />
</TouchableOpacity>
</CellContainer>
)
}
.
const layoutMaker = () => new LayoutProvider(
(index) => {
return ViewTypes.FULL;
},(type,dim) => {
dim.width = width;
dim.height = 70;
},)
class CellContainer extends React.Component {
constructor(args) {
super(args);
this._containerId = containerCount++
}
render() {
return <View {...this.props}>{this.props.children}</View>
}
}
一切正常,唯一的问题是progressBar UI没有更新。甚至状态中的值也会正确更新。 [1]:https://github.com/Flipkart/recyclerlistview
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)