在这个我做了一个列表,有数据,我把它给listview.builder我的问题是,当我想删除第二个地图与_removeFromList它从列表中删除,但列表视图。生成器不能正确显示
与
第323mb
5.49 MB in second,
405 MB排名第三,
当我删除第二个映射时,它是这样的=>
第一个
323mb5.49 MB in second
,这都是错的,当我删除第二个映射时,它应该显示如下
323mb405 MB/秒,
List<Map<String, dynamic>> _myList = [{size : 323},{size:4.49},{size: 405}];
void _saveList() async {
// print('Before getting SharedPreferences instance');
SharedPreferences prefs = await SharedPreferences.getInstance();
// print('After getting SharedPreferences instance');
List<String> myListString =
_myList.map((item) => jsonEncode(item)).toList();
// print('the data is saved');
prefs.setStringList('myList', myListString);
}
// load myList
void _loadownloadManagerist() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
List<String> myListString = prefs.getStringList('myList') ?? [];
setState(() {
_myList = myListString
.map((item) => Map<String, dynamic>.from(jsonDecode(item)))
.toList();
});
}
// remove the map from myList
void _removeFromList(int item) {
setState(() {
_myList.removeAt(item);
_saveList();
_loadownloadManagerist();
});
}
Expanded(
child: ListView.builder(
itemCount: _myList.length,
itemBuilder: (context, index) {
return DownloadingCardMain(
UrlSize: _myList.isNotEmpty ? _myList[index]['urlSize'] : 0,
);
},
))
当我关闭程序并再次运行时
它告诉我正确的那个
但是我想当我删除第二个的时候这个就会发生
问题就在这三行
_myList.removeAt(item);
_saveList();
_loadownloadManagerist();
_saveList
和_loadownloadManagerist
都执行异步代码(futures
),这意味着它们创建了一个线程来做一些工作,但不等待它完成,并执行下一行。
在你的例子中,当你调用_saveList
- 它运行其中的代码
- 面对
async
代码,所以它在不同的线程中执行,并继续程序,(注意它不会在同一个函数中继续,函数执行的其余部分将停止,直到async(future)完成), - 当继续程序时,它会运行下一个函数,即
_loadownloadManagerist
。
这里做的是在sharedPrefs
中更新列表之前先加载列表您需要做的是等待_saveList
未来完成,通过await
,只需在函数之前添加一个await
。您还必须更改该函数以返回Future
。
那么代码将是这样的:
Future<void> _saveList() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
List<String> myListString =_myList.map((item) => jsonEncode(item)).toList();
// await this function to finish
await prefs.setStringList('myList', myListString);
}
// load myList
Future<void> _loadownloadManagerist() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
List<String> myListString = prefs.getStringList('myList') ?? [];
setState(() {
_myList = myListString
.map((item) => Map<String, dynamic>.from(jsonDecode(item)))
.toList();
});
}
// remove the map from myList
Future<void> _removeFromList(int item) async {
_myList.removeAt(item);
// await this future to finish before executing the next line
await _saveList();
await _loadownloadManagerist();
setState(() {
});
}