【问题标题】:dismiss database data with listview使用 listview 关闭数据库数据
【发布时间】:2019-12-07 20:26:24
【问题描述】:

现在我做了这样的代码

 FutureBuilder(
                future: getData2(),
                builder: (context, snapshot) {
                  if (snapshot.hasData) {
                    List data = snapshot.data;
                    return ListView.builder(
                      shrinkWrap: true,
                      itemCount: data.length,
                      itemBuilder: (context, index) {
                        final item = data[index];
                        return Dismissible(
                          key: Key(item['loc3']),
                          onDismissed: (direction) {
                            setState(() async {
                              await openData2().then((value) {
                                value.delete(
                                  'test2',
                                  where: 'loc3 = ?',
                                  whereArgs: ['loc3'],
                                );
                              });
                            });
                          },
                          child: ListTile(
                            title: Text(item['loc3']),
                          ),
                        );
                      },
                    );

但是当我关闭一个项目时 控制台中有一些注释“引发了另一个异常:setState() 回调参数返回了 Future。” 在 setState 我不返回任何变量
他们为什么这样说?

当我第一次删除一个项目时,会出现更多细节错误

在通知 AnimationController 的侦听器时引发以下断言:
I/flutter (6018):setState() 回调参数返回一个 Future。
I/flutter (6018):PositionedTilesState#6d110 上的 setState() 方法是使用闭包或方法调用的,
I/flutter (6018):返回一个 Future。也许它被标记为“异步”。
I/flutter (6018):不是在 setState() 调用中执行异步工作,而是先执行工作(没有
I/flutter(6018):更新小部件状态),然后在调用 setState() 时同步更新状态。
I/flutter(6018):抛出异常时,这里是栈:

【问题讨论】:

    标签: flutter


    【解决方案1】:

    我认为第一个问题是你在setState 中有一个async 函数。改成这样:

    ...
                                  onDismissed: (direction) async {
                                  await openData2().then((value) {
                                        value.delete(
                                          'test2',
                                          where: 'loc3 = ?',
                                          whereArgs: ['loc3'],
                                        );
                                      });
                                  setState(() {});
                                  },
    '''
    

    或者这个(更易读):

    ...
                                  onDismissed: (direction) {
    
                               Future<void> delete() async {
                                   await openData2().then((value) {
                                        value.delete(
                                          'test2',
                                          where: 'loc3 = ?',
                                          whereArgs: ['loc3'],
                                        );
                                      });
                                     }
    
                                  setState(() {
                                       delete();
                                         });
                                        },
    '''
    

    关键是,您不能在 setState 内部执行 async 操作。

    【讨论】:

    • 我试过你说的,但这里有其他错误 ------------------------------ 另一个例外已抛出:已关闭的 Dismissible 小部件仍然是树的一部分。
    • 现在只是这个错误吗?之前的错误是否仍然显示?
    • 是的,现在就是那个错误,更多信息 openData2() 返回 DataBase 变量,getdData2() 返回数据表列表
    • 我认为 List data = snapshot.data;这部分是问题,当我解雇它仍然有以前的数据(长度)
    • 我刚从数据库中得到列表并删除了futurebuilder
    猜你喜欢
    • 2017-01-20
    • 1970-01-01
    • 2014-10-06
    • 2012-12-28
    • 2015-08-02
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多