如何在将项目插入AnimatedList(连接到Firebase数据库)期间修复rangeError

凯利登

我正在将文档插入数据库中,并更新AnimatedList的GlobalKey的currentState,以便让它知道添加的新项目,我正在考虑rangeError

但过一会儿,小部件的重建修复了错误屏幕,并且我的新项目正常添加

我认为问题是当我使用此方法时,从数据库获取数据的时间不足以更新原因:

sleep(const Duration(seconds:1));

错误没有出现

我也在检查snapshot.data的列表中的项目数和文档数,它们在小部件的构建过程中不相等,这给我一个错误,但是在重建过程中它们是相等的,而重建过程是在错误构建之后开始的删除也一样,但是删除过程中没有错误屏幕

这是我的代码:

import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
////////////////////////////////////////////////////////////////////////
///////////////////////LIST/////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////

class Item {
  Item({this.name, this.icon});
  Icon icon;
  String name;
}

class ListScreen extends StatefulWidget {
  @override
  _ListScreenState createState() => _ListScreenState();
}

class _ListScreenState extends State<ListScreen> {
  GlobalKey<AnimatedListState> listKey = GlobalKey<AnimatedListState>();
  int  id;
  bool isInit = true;
  var animatedList;

  _addItem() {
    Firestore.instance.collection('incrementID').document('IDINCREMENTATION')
        .setData({'lastID':--id});
    setState(() {
      Firestore.instance.collection('items').document('ITEM_$id')
          .setData({'name':'Item $id'});
      listKey.currentState.insertItem(0);

      //sleep(const Duration(seconds:1));
    });
  }

  _removeItem(int index, DocumentSnapshot snapshot) {
    setState(() {
      Firestore.instance.runTransaction((Transaction transaction) async{
        await transaction.delete(snapshot.reference);
      });
      listKey.currentState.removeItem(
        index,
            (context, animation) => buildItem(context, snapshot, 0, animation),
        duration: const Duration(milliseconds: 100),
      );
    });
  }

  Widget buildItem(
      BuildContext context, DocumentSnapshot document, int index, Animation<double> animation) {
    return SizeTransition(
      axis: Axis.vertical,
      sizeFactor: animation,
      child: SizedBox(
        child: ListTile(
          title: Text(document['name']),
          onTap: (){
            _removeItem(index, document);
          },
        ),
      ),
    );
  }
// getting last used id
  getData() async {
    return await Firestore.instance.collection('incrementID').getDocuments();
  }
  @override
  Widget build(BuildContext context) {
      getData().then((val) {
        id = int.parse(val.documents[0].data['lastID'].toString());
      });
      return Scaffold(
        body: Directionality(
            textDirection: TextDirection.ltr,
            child: StreamBuilder(
              stream: Firestore.instance.collection('items').snapshots(),
              builder: (context, snapshot) {
                if (!snapshot.hasData ) return const Text('Loading...');
                animatedList = new AnimatedList(
                  key: listKey,
                  initialItemCount: snapshot.data.documents.length,
                  itemBuilder: (context, index, animation) {
                    return
                      buildItem(
                          context, snapshot.data.documents[index], index,
                          animation);
                  },
                );
                return animatedList;
              },
            )),
        floatingActionButton: FloatingActionButton(
          onPressed: _addItem,
          tooltip: 'Decrement',
          child: Icon(Icons.add),
        ),
      );
  }
}
扬斯托尔

你大概应该await然后insertItem()

_addItem() async {
  await Firestore.instance.collection('incrementID').document('IDINCREMENTATION')
      .setData({'lastID':--id});
  await Firestore.instance.collection('items').document('ITEM_$id')
      .setData({'name':'Item $id'});

  setState(() {
    listKey.currentState.insertItem(0);
  });
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何修复连接到“wrds”数据库的错误?

来自分类Dev

将连接到foreach循环的数组插入数据库

来自分类Dev

如何修复将数据插入数据库mysql python

来自分类Dev

如何将Oracle数据库连接到Visual Studio C#项目

来自分类Dev

如何将cordova项目连接到数据库?

来自分类Dev

如何在应用程序运行期间使用 Laravel 连接到不同的数据库?

来自分类Dev

将LINQ to SQL连接到数据库项目而不是物理数据库吗?

来自分类Dev

数据库项目连接到数据库实例-如何管理项目中实际数据库的子集

来自分类Dev

如何在openshift中连接到数据库?

来自分类常见问题

如何在Julia中连接到MySQL数据库

来自分类Dev

如何在Julia中连接到MySQL数据库

来自分类Dev

如何在openshift中连接到数据库?

来自分类Dev

使用laravel将Firebase实时数据库连接到MYSQL数据库表

来自分类Dev

如何将网站连接到MYSQL数据库?

来自分类Dev

如何将Airflow连接到Oracle数据库

来自分类Dev

如何将GridView连接到数据库?

来自分类Dev

如何将网站连接到MYSQL数据库?

来自分类Dev

如何将HTML连接到Phpadmin数据库?

来自分类Dev

如何将UCanAccess连接到使用数据库密码加密的Access数据库?

来自分类Dev

从 Visual Basic 2010 连接到 ms access 数据库时如何修复溢出异常

来自分类Dev

我如何连接到数据库

来自分类Dev

如何从Unity连接到数据库

来自分类Dev

如何连接到远程数据库

来自分类Dev

如何连接到数据库

来自分类Dev

项目传输期间的数据库连接错误

来自分类Dev

通过Entity Framework Core将多个数据库连接到.NET Core项目

来自分类Dev

如何在XAMPP服务器上使用php将MySQL数据库连接到html页面?

来自分类Dev

如何在插入期间使EF 6处理数据库上的DEFAULT CONSTRAINT

来自分类Dev

用户注册期间如何在Firebase的实时数据库中存储数据?

Related 相关文章

  1. 1

    如何修复连接到“wrds”数据库的错误?

  2. 2

    将连接到foreach循环的数组插入数据库

  3. 3

    如何修复将数据插入数据库mysql python

  4. 4

    如何将Oracle数据库连接到Visual Studio C#项目

  5. 5

    如何将cordova项目连接到数据库?

  6. 6

    如何在应用程序运行期间使用 Laravel 连接到不同的数据库?

  7. 7

    将LINQ to SQL连接到数据库项目而不是物理数据库吗?

  8. 8

    数据库项目连接到数据库实例-如何管理项目中实际数据库的子集

  9. 9

    如何在openshift中连接到数据库?

  10. 10

    如何在Julia中连接到MySQL数据库

  11. 11

    如何在Julia中连接到MySQL数据库

  12. 12

    如何在openshift中连接到数据库?

  13. 13

    使用laravel将Firebase实时数据库连接到MYSQL数据库表

  14. 14

    如何将网站连接到MYSQL数据库?

  15. 15

    如何将Airflow连接到Oracle数据库

  16. 16

    如何将GridView连接到数据库?

  17. 17

    如何将网站连接到MYSQL数据库?

  18. 18

    如何将HTML连接到Phpadmin数据库?

  19. 19

    如何将UCanAccess连接到使用数据库密码加密的Access数据库?

  20. 20

    从 Visual Basic 2010 连接到 ms access 数据库时如何修复溢出异常

  21. 21

    我如何连接到数据库

  22. 22

    如何从Unity连接到数据库

  23. 23

    如何连接到远程数据库

  24. 24

    如何连接到数据库

  25. 25

    项目传输期间的数据库连接错误

  26. 26

    通过Entity Framework Core将多个数据库连接到.NET Core项目

  27. 27

    如何在XAMPP服务器上使用php将MySQL数据库连接到html页面?

  28. 28

    如何在插入期间使EF 6处理数据库上的DEFAULT CONSTRAINT

  29. 29

    用户注册期间如何在Firebase的实时数据库中存储数据?

热门标签

归档