UI 未正确更新



在这个我做了一个列表,有数据,我把它给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(() {
});
}