问题描述
我想知道这是否可以归类为错误。但是,以某种方式,如果用户几乎同时快速滑动多个dismissible
小部件,就会有一种罕见的(也许很奇怪)的体验,即所有这些滑动小部件都无法从视图和List
中完全移除。在最终视图中,尽管以前只是滑动过,但仍然会有一个(很少有两个或更多)dismissible
小部件保留在视图中。
这个想法是因为在setState
函数中使用了ondismissed
,这会导致尝试在几乎完全相同的时间删除所有已刷过的dismissible
之间的时间顺序冲突(以毫秒为单位的时间差)并完全更新视图。冲突导致第一个窗口小部件被成功删除,但是第二个及以后的窗口小部件(也刚刚被刷掉)没有时间删除,因为视图setState
从第一个删除的窗口小部件(新列表将只删除第一个小部件。
复制步骤
通过使用如下所示的官方文档代码:
import 'package:Flutter/foundation.dart';
import 'package:Flutter/material.dart';
void main() {
runApp(MyApp());
}
// MyApp is a StatefulWidget. This allows updating the state of the
// widget when an item is removed.
class MyApp extends StatefulWidget {
MyApp({Key key}) : super(key: key);
@override
MyAppState createState() {
return MyAppState();
}
}
class MyAppState extends State<MyApp> {
final items = List<String>.generate(20,(i) => "Item ${i + 1}");
@override
Widget build(BuildContext context) {
final title = 'dismissing Items';
return MaterialApp(
title: title,theme: ThemeData(
primarySwatch: Colors.blue,),home: Scaffold(
appBar: AppBar(
title: Text(title),body: ListView.builder(
itemCount: items.length,itemBuilder: (context,index) {
final item = items[index];
return dismissible(
// Each dismissible must contain a Key. Keys allow Flutter to
// uniquely identify widgets.
key: Key(item),// Provide a function that tells the app
// what to do after an item has been swiped away.
ondismissed: (direction) {
// Remove the item from the data source.
setState(() {
items.removeAt(index);
});
// Then show a snackbar.
Scaffold.of(context)
.showSnackBar(SnackBar(content: Text("$item dismissed")));
},// Show a red background as the item is swiped away.
background: Container(color: Colors.red),child: ListTile(title: Text('$item')),);
},);
}
}
预期结果:
同时快速滑动(删除)两个或更多dismissible
小部件时,必须从用户视图及其List
中彻底删除所有这些滑动小部件。
实际结果:
一个(或多个)dismissible
小部件仍然很少保留在视图中(当然也保留在List
中)
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)