Flutter 需要一些解决方法来制作颤振';s Dismissible小部件异步工作
我想知道这是否可以归类为一个bug。但不知何故,如果用户几乎同时快速滑动多个Flutter 需要一些解决方法来制作颤振';s Dismissible小部件异步工作,flutter,flutter-widget,dismissible,Flutter,Flutter Widget,Dismissible,我想知道这是否可以归类为一个bug。但不知何故,如果用户几乎同时快速滑动多个可忽略的小部件,则会有一种罕见的(可能很奇怪的)体验,即任何被滑动的小部件都不会从视图和列表中完全移除。在最终视图中,将有一个(很少有两个或更多)可忽略的小部件仍然保留在视图中,尽管它们之前刚刚被刷过 其思想是,由于在onDismissed函数中使用setState,这将导致在几乎完全相同的时间(毫秒时间单位的差异)尝试删除所有刷卡的可忽略的与完全更新视图之间的时间顺序冲突。然后导致第一个小部件的冲突被成功删除,但是第二
可忽略的
小部件,则会有一种罕见的(可能很奇怪的)体验,即任何被滑动的小部件都不会从视图和列表中完全移除。在最终视图中,将有一个(很少有两个或更多)可忽略的
小部件仍然保留在视图中,尽管它们之前刚刚被刷过
其思想是,由于在onDismissed
函数中使用setState
,这将导致在几乎完全相同的时间(毫秒时间单位的差异)尝试删除所有刷卡的可忽略的
与完全更新视图之间的时间顺序冲突。然后导致第一个小部件的冲突被成功删除,但是第二个和以后的小部件(也只是被刷过)没有时间被删除,因为视图从第一个删除的小部件更新为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')),
);
},
),
),
);
}
}
导入“包:flift/foundation.dart”;
进口“包装:颤振/材料.省道”;
void main(){
runApp(MyApp());
}
//MyApp是一个有状态的小部件。这允许更新服务器的状态
//当一个项目被删除时。
类MyApp扩展了StatefulWidget{
MyApp({Key}):超级(Key:Key);
@凌驾
MyAppState createState(){
返回MyAppState();
}
}
类MyAppState扩展了状态{
final items=List.generate(20,(i)=>“Item${i+1}”);
@凌驾
小部件构建(构建上下文){
最终标题=‘解雇项目’;
返回材料PP(
标题:标题,,
主题:主题数据(
主样本:颜色。蓝色,
),
家:脚手架(
appBar:appBar(
标题:文本(标题),
),
正文:ListView.builder(
itemCount:items.length,
itemBuilder:(上下文,索引){
最终项目=项目[索引];
可驳回的回报(
//每个可弃物品必须包含一把钥匙。钥匙允许颤振
//唯一标识小部件。
键:键(项),
//提供告知应用程序的功能
//物品被刷走后要做什么。
onDismissed:(方向){
//从数据源中删除该项。
设置状态(){
项目移除(索引);
});
//然后展示一个小吃条。
脚手架(上下文)
.showSnackBar(SnackBar(内容:文本($item disposed));
},
//当项目被刷走时显示红色背景。
背景:容器(颜色:Colors.red),
子项:ListTile(标题:文本(“$item”),
);
},
),
),
);
}
}
预期结果:
当同时以足够快的速度滑动(移除)两个或多个可忽略的
小部件时,必须从用户视图及其列表中完全移除所有这些滑动的小部件
实际结果:
很少有机会一个(或多个)Dismissible
小部件仍保留在视图中(当然也保留在列表中)