Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 需要一些解决方法来制作颤振';s Dismissible小部件异步工作_Flutter_Flutter Widget_Dismissible - Fatal编程技术网

Flutter 需要一些解决方法来制作颤振';s Dismissible小部件异步工作

Flutter 需要一些解决方法来制作颤振';s Dismissible小部件异步工作,flutter,flutter-widget,dismissible,Flutter,Flutter Widget,Dismissible,我想知道这是否可以归类为一个bug。但不知何故,如果用户几乎同时快速滑动多个可忽略的小部件,则会有一种罕见的(可能很奇怪的)体验,即任何被滑动的小部件都不会从视图和列表中完全移除。在最终视图中,将有一个(很少有两个或更多)可忽略的小部件仍然保留在视图中,尽管它们之前刚刚被刷过 其思想是,由于在onDismissed函数中使用setState,这将导致在几乎完全相同的时间(毫秒时间单位的差异)尝试删除所有刷卡的可忽略的与完全更新视图之间的时间顺序冲突。然后导致第一个小部件的冲突被成功删除,但是第二

我想知道这是否可以归类为一个bug。但不知何故,如果用户几乎同时快速滑动多个
可忽略的
小部件,则会有一种罕见的(可能很奇怪的)体验,即任何被滑动的小部件都不会从视图和
列表中完全移除。在最终视图中,将有一个(很少有两个或更多)可忽略的
小部件仍然保留在视图中,尽管它们之前刚刚被刷过

其思想是,由于在
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
小部件仍保留在视图中(当然也保留在
列表中)