需要一些解决方法以使Flutter的Dismissible小部件能够异步工作

问题描述

我想知道这是否可以归类为错误。但是,以某种方式,如果用户几乎同时快速滑动多个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 (将#修改为@)