【问题标题】:Flutter: Firebase read data from userIDFlutter:Firebase从用户ID读取数据
【发布时间】:2020-08-14 04:27:04
【问题描述】:

我正在使用 Flutter 构建一个 ToDo 应用程序。现在我添加了一个匿名登录,所以每台设备都有自己的待办事项。但所有设备仍显示相同的待办事项。我尝试添加 .document(user.uid) 但这不起作用,因为“用户”带有红色下划线。那么如何才能读取此设备上一个用户的数据呢?我遇到的另一个问题是 ToDo 没有添加到数据库中现有的用户 ID 文档中,否则它只会更新“旧”文档。这是我的代码:(如果您需要另一部分代码,请告诉我)

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {


  String input = "";


  createTodos() async{
    FirebaseUser user = await FirebaseAuth.instance.currentUser();
    DocumentReference documentReference =
    Firestore.instance.collection("MyTodos").document(user.uid);

    //Map
    Map<String, String> todos = {"todoTitle": input};

    documentReference.setData(todos).whenComplete(() {
      print("$input created");
    });
  }

  deleteTodos(item) {
    DocumentReference documentReference =
    Firestore.instance.collection("users").document();


    documentReference.delete().whenComplete(() {
      print("$item deleted");
    });
  }

  moveTodos(item) {
    DocumentReference documentReference =
    Firestore.instance.collection("users").document(item);

    //Map
    Map<String, String> todos = {"todoMove": item};

    documentReference.setData(todos).whenComplete(() {
      print("$input moved");
    });
  }


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      floatingActionButton: FloatingActionButton(
          onPressed: () {
            showDialog(
                context: context,
                builder: (BuildContext context) {
                  return AlertDialog(
                    backgroundColor: Colors.grey[300],
                    title: Text('Add ToDo',
                      style: TextStyle(fontWeight: FontWeight.bold),),
                    shape: RoundedRectangleBorder(
                        borderRadius: BorderRadius.circular(15)
                    ),
                    content: TextField(
                      onChanged: (String value) {
                        input = value;
                      },
                    ),
                    actions: <Widget>[
                      FlatButton(
                          onPressed: () {
                            createTodos();

                            Navigator.of(context).pop();
                          },
                          child: Text('Add'))
                    ],
                  );
                });
          },
          child: Container(
            width: 200,
            height: 200,
            child: Icon(Icons.add, color: Colors.grey[700],),
            decoration: BoxDecoration(
                color: Colors.grey[300],
                borderRadius: BorderRadius.all(Radius.circular(50)),
                boxShadow: [
                  BoxShadow(
                      color: Colors.grey[500],
                      offset: Offset(4.0, 4.0),
                      blurRadius: 15.0,
                      spreadRadius: 1.0
                  ),
                  BoxShadow(
                      color: Colors.white,
                      offset: Offset(-4.0, -4.0),
                      blurRadius: 15.0,
                      spreadRadius: 1.0
                  ),
                ]
            ),
          )
      ),
      body: StreamBuilder(
          stream: Firestore.instance.collection("users").snapshots(),
          builder: (context, snapshots){

            if(snapshots.data == null) return CircularProgressIndicator();

            return ListView.builder(
                shrinkWrap: true,
                itemCount: snapshots.data.documents.length,
                itemBuilder: (context, index) {
                  DocumentSnapshot documentSnapshot = snapshots.data.documents[index];
                  return Dismissible(
                    background: Container(
                      color: Colors.green,
                      alignment: Alignment(-0.9, 0),
                      child: Icon(Icons.check, color: Colors.white,),
                    ),
                    secondaryBackground: Container(
                      color: Colors.red,
                      alignment: Alignment(0.9, 0),
                      child: Icon(Icons.delete, color: Colors.white,),
                    ),
                    onDismissed: (direction) {
                      if (direction == DismissDirection.startToEnd) {
                        moveTodos(documentSnapshot["todoTitle"]);
                        deleteTodos(documentSnapshot["todoTitle"]);
                      } else
                      if (direction == DismissDirection.endToStart) {
                        deleteTodos(documentSnapshot["todoTitle"]);
                      }
                    },
                    key: Key(documentSnapshot["todoTitle"]),
                    child: Container(
                      margin: EdgeInsets.all(8),
                      child: Card(
                        margin: EdgeInsets.zero,
                        shape: RoundedRectangleBorder(
                            borderRadius: BorderRadius.circular(10)
                        ),
                        color: Colors.grey[300],
                        child: ListTile(
                          title: Text(documentSnapshot["todoTitle"] ?? "No ToDos yet!"),
                          trailing: Wrap(
                            children: <Widget>[
                              IconButton(
                                  icon: Icon(Icons.check),
                                  color: Colors.green,
                                  onPressed: (){
                                    moveTodos(documentSnapshot["todoTitle"]);
                                    deleteTodos(documentSnapshot["todoTitle"]);
                                  } ),
                              IconButton(
                                  icon: Icon(Icons.delete),
                                  color: Colors.red,
                                  onPressed: (){
                                    deleteTodos(documentSnapshot["todoTitle"]);
                                  } ),
                            ],
                          )
                        ),
                      ),
                      decoration: BoxDecoration(
                          color: Colors.grey[300],
                          borderRadius: BorderRadius.all(Radius.circular(10)),
                          boxShadow: [
                            BoxShadow(
                                color: Colors.grey[500],
                                offset: Offset(4.0, 4.0),
                                blurRadius: 15.0,
                                spreadRadius: 1.0
                            ),
                            BoxShadow(
                                color: Colors.white,
                                offset: Offset(-4.0, -4.0),
                                blurRadius: 15.0,
                                spreadRadius: 1.0
                            ),
                          ]
                      ),
                    ),
                  );
                });
          }),
      backgroundColor: Colors.grey[300],
    );
  }
}

【问题讨论】:

  • 使用.where('userId', isEqualTo: user.uid).snapshots()
  • 我现在试过了,但 user.uid 中的用户总是用红色下划线。我该如何解决?
  • FirebaseUser user = await FirebaseAuth.instance.currentUser(); 移动到 _HomePageState 类中,即低于 String input = ' ';

标签: firebase flutter google-cloud-firestore


【解决方案1】:

问题出在下面一行:

stream: Firestore.instance.collection("users").snapshots(),

它基本上会抓取“用户”集合中的所有内容并将其显示给所有人。您只需在从 Firestore 中获取数据时添加用户特定的过滤器。您可能希望将过滤器添加为:

stream: Firestore.instance.collection("users")
  .where('userId', isEqualTo: user.uid)
  .snapshots()

【讨论】:

  • 我现在试过了,但 user.uid 中的用户总是用红色下划线。我该如何解决?
猜你喜欢
  • 1970-01-01
  • 2018-02-10
  • 2021-03-12
  • 1970-01-01
  • 2021-12-05
  • 2015-06-02
  • 2016-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多