firebase - Firebase:让用户分别与服务器通信

标签 firebase flutter dart server google-cloud-firestore

我已经用Flutter和Firebase构建了一个ToDo应用程序,但是现在我遇到的问题是,每个设备都显示相同的ToDos。 那么,如何让他们每个人分别与服务器通信,以便每个设备/用户都可以拥有自己的ToDos?那是我的代码。我还使用FloatingAciontbutton创建ToDos。

String input = "";


  createTodos() {
    DocumentReference documentReference =
    Firestore.instance.collection("MyTodos").document(input);

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

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

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


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

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

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

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




  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: StreamBuilder(
          stream: Firestore.instance.collection("MyTodos").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
                            ),
                          ]
                      ),
                    ),
                  );
                });
          }),

最佳答案

您需要创建一个用户集合:

users(collection) --> userId(document) -> userData

然后,您可以创建一个待办事项集合:
myTodos(collection) --> userId(document) --> todoData

因此,在创建时,您可以执行以下操作:
  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");
    });
  }

使用uid,您可以检索每个用户的待办事项

关于firebase - Firebase:让用户分别与服务器通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61497267/

相关文章:

ios - 验证后未从所有 View 中删除 View

list - flutter 如何在初始化状态下使用 future 的异步方法

android - Firebase 数据库安全,无需 Firebase 身份验证

node.js - 如何在 node.js 中设置 Geofire

dart - 如何从列表中的项目创建逗号分隔的字符串

flutter - 具有动态宽度的Flutter水平gridview

flutter - 我/flutter (8686) : Another exception was thrown: NoSuchMethodError: The method 'save' was called on null

flutter - 上滑换屏动画

flutter - 如何将 Future<dynamic> 转换为 dart 中的字符串 :flutter

Flutter删除For循环中的多个列表项(For循环中的多个返回)