【问题标题】:Flutter/Firebase-How to perform delete document functionality when document ID is not known?Flutter/Firebase-文档ID未知时如何执行删除文档功能?
【发布时间】:2020-09-28 12:37:46
【问题描述】:

我是 Flutter 和开发应用程序的新手,我在其中显示来自 ListView 的数据。其中有一个删除图标按钮。我希望删除选定的 ListTile 数据。它以列表的形式显示数据,但不删除。 在我添加了 deleteData() 方法之后。它显示以下错误:

'package:flutter/src/rendering/silver_multi_box_adaptor.dart':失败 断言:第 263 行 pos 16:'child == null ||索引(子)>索引' : 不是真的。

非常感谢任何帮助。这是我到目前为止所做的:

class OrderRequestModel extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: UserOrderRequestModel(),
      theme: new ThemeData(
        primarySwatch: Colors.red,
      ),
    );
  }
}

class UserOrderRequestModel extends StatefulWidget {
  @override
  _UserOrderRequestModelState createState() {
    return _UserOrderRequestModelState();
  }
}

class _UserOrderRequestModelState extends State<UserOrderRequestModel> {
  deleteData(docId) {
    Firestore.instance
        .collection('order_tbl')
        .document(docId)
        .delete()
        .catchError((e) {
      print(e);
    });
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: _buildBody(context),
    );
  }
  Stream<QuerySnapshot> getData() async*{
    FirebaseUser firebaseUser = await FirebaseAuth.instance.currentUser();
    yield* Firestore.instance.collection('order_tbl').orderBy('timestamp', descending: true).snapshots();
  }

  Widget _buildBody(BuildContext context) {
    return StreamBuilder<QuerySnapshot>(
      stream: getData(),
      builder: (context, snapshot) {
        if (!snapshot.hasData) return LinearProgressIndicator();
        return _buildList(context, snapshot.data.documents);
      },
    );
  }

  Widget _buildList(BuildContext context, List<DocumentSnapshot> snapshot) {
    return ListView(
      padding: const EdgeInsets.only(top: 5.0),
      children: snapshot.map((data) => _buildListItem(context, data)).toList(),
    );
  }

  Widget _buildListItem(BuildContext context, DocumentSnapshot data) {
    final record = Record.fromSnapshot(data);
    String _string =getTimeDifferenceFromNow(record.timestamp.toDate());
    return Padding(
      key: ValueKey(record.animal),
      padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
      child: Container(
          decoration: BoxDecoration(
            border: Border.all(color: Colors.grey),
            borderRadius: BorderRadius.circular(5.0),
          ),
          child: new ListTile(
            title: new Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: <Widget>[
                new Text(
                  "${record.quantity} kg ${record.animal} - ${record.mobile}",
                  style: new TextStyle(fontWeight: FontWeight.bold, color: Colors.black),
                ),
                new Text(
                  _string,
                  style: new TextStyle(color: Colors.grey, fontSize: 12.0),
                ),
              ],
            ),
            trailing: IconButton(
              icon: Icon(Icons.delete_forever),
              onPressed: () => deleteData(data.documentID),
            ),

            subtitle: new Container(
              padding: const EdgeInsets.only(top: 5.0),
              child: new Text(
                record.address,
                style: new TextStyle(color: Colors.red, fontSize: 12.0,),
              ),
            ),
          ),
      ),
    );
  }
}

【问题讨论】:

  • 您的数据已更新,但状态保持不变。只需添加: setState(() {});从 firestore 中删除数据后,在 deleteData 方法中。
  • ════════ 渲染库捕获异常═══════════════════════════ ════════════════════════'package:flutter/src/material/material.dart':断言失败:第608行第12行:'referenceBox.attached ':不是真的。@SanketVekariya
  • 'child==null || indexOf(child)>index' 不正确

标签: firebase flutter dart google-cloud-firestore


【解决方案1】:
  • 删除单个文档:

    var collection = FirebaseFirestore.instance.collection('users');
    await collection.doc('document_id').delete();
    
  • 删除部分文档:

    var collection = FirebaseFirestore.instance.collection('users');
    var snapshot = await collection.where('age', isGreaterThan: 20).get();
    for (var doc in snapshot.docs) {
     await doc.reference.delete();
    }
    
  • 删除所有文件:

    var collection = FirebaseFirestore.instance.collection('users');
    var snapshot = await collection.get();
    for (var doc in snapshot.docs) {
      await doc.reference.delete();
    }
    

【讨论】:

    【解决方案2】:

    也许这应该可行,我已将您的代码更改为我的一个,它非常有效。

    import 'package:cloud_firestore/cloud_firestore.dart';
    import 'package:flutter/material.dart';
    
    class MyDeletingApp extends StatelessWidget {
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Google SignIn',
          debugShowCheckedModeBanner: false,
          theme: ThemeData(
            primarySwatch: Colors.red,
          ),
          home: DeleteDataFromFireStore(),
        );
      }
    }
    class DeleteDataFromFireStore extends StatelessWidget {
      final db = Firestore.instance;
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(title: Text("Delete Data from Firestore")),
          body: ListView(
            padding: EdgeInsets.all(12.0),
            children: <Widget>[
              StreamBuilder<QuerySnapshot>(
                  stream: db.collection('order_tbl').snapshots(),
                  builder: (context, snapshot) {
                    if (snapshot.hasData) {
                      return Column(
                        children: snapshot.data.documents.map((doc) {
                          return Padding(
                            padding: const EdgeInsets.symmetric(horizontal: 5.0, vertical: 8.0),
                            child: Container(
                              decoration: BoxDecoration(
                                border: Border.all(color: Colors.grey),
                                borderRadius: BorderRadius.circular(5.0),
                            ),
                              child: ListTile(
                                onTap:() async { await db.collection('order_tbl').document(doc.documentID).delete();},
                                onLongPress:() async { await db.collection('order_tbl').document(doc.documentID).delete();},
                                title: new Row(
                                  mainAxisSize: MainAxisSize.max,
                                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
                                  children: <Widget>[
                                    Text(
                                      "${doc.data['quantity']} kg ${doc.data['animal']} - ${doc.data['mobile']}",
                                      style: new TextStyle(fontWeight: FontWeight.bold, color: Colors.black),
                                    ),
    //                                Text(
    //                                  "${doc.data['quantity']}",
    //                                  style: new TextStyle(color: Colors.grey),
    //                                ),
                                  ],
                                ),
                                subtitle: new Container(
                                  padding: const EdgeInsets.only(top: 5.0),
                                  child: new Text("${doc.data['user']} - ${doc.data['address']} ",
                                    style: new TextStyle(color: Colors.red, fontSize: 12.0,),
                                  ),
                                ),
                                trailing: IconButton(
                                  icon: Icon(Icons.verified_user),
                                  onPressed: () async {
                                    await db.collection('order_tbl').document(doc.documentID).delete();
                                  },
                                ),
                              ),
                            ),
                          );
                        }).toList(),
                      );
                    } else {
                      return SizedBox();
                    }
                  }),
            ],
          ),
        );
      }
    }
    

    【讨论】:

    • 哦,它工作正常,我只是更改了方法名称。谢谢!找到了解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-28
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    相关资源
    最近更新 更多