【问题标题】:return a value of a map返回地图的值
【发布时间】:2021-07-08 15:12:15
【问题描述】:

我正在从 firebase 实时数据库中获取特定的数据集,并尝试返回地图的单个值。它可以在地图中打印变量,但我无法返回它。

在这种情况下,函数 get_Name 应该返回值“Michael”

实时数据库结构:


-MdXLzrGo4qIGO67ujNM
-MdXT0oysMDxqFQ5KurB
-Me4Kpz1He0v1QuH2e7Z
演员日期:“”
演员位置:“”
演员名称:“迈克尔”

void initState() {
   test = get_Name("-Me4Kpz1He0v1QuH2e7Z");
   print(test); 

    super.initState();
}

get_Name(String GroupID){
    var Name;
    DatabaseReference db;
    db = FirebaseDatabase.instance.reference().child("group");
    db.orderByKey().equalTo(GroupID).once().then((DataSnapshot snapshot){
      Map<dynamic, dynamic> DB_value = snapshot.value;
      DB_value.forEach((key,values) {
        Name =values["castName"];
        print(Name); // prints "Michael"
      });
    });
   return Name; //returns "NULL"
  }

提前致谢
伯恩哈德

【问题讨论】:

    标签: flutter dart firebase-realtime-database


    【解决方案1】:

    您当前代码的问题是缺少对.then() 将在您返回Name 之后异步执行的理解。

    尝试将方法重写为类似这样的方法,我们将方法标记为async,这允许我们使用await 而不是使用.then(),这使得代码更易于理解:

    Future<String> get_Name(String GroupID) async {
      String name;
      final db = FirebaseDatabase.instance.reference().child("group");
      final snapshot = await db.orderByKey().equalTo(GroupID).once();
    
      Map<dynamic, dynamic> DB_value = snapshot.value;
      DB_value.forEach((key, values) {
        name = values["castName"] as String;
        print(name); // prints "Michael"
      });
    
      return name; //returns "NULL"
    }
    

    方法的返回值为Future&lt;String&gt;Futureasync标记的方法需要)表示调用get_Name的方法也需要await答案,因为一切都将是异步的执行。

    【讨论】:

      【解决方案2】:

      应该从 then 块内部返回。

      get_Name(String GroupID){
          var Name;
          DatabaseReference db;
          db = FirebaseDatabase.instance.reference().child("group");
          db.orderByKey().equalTo(GroupID).once().then((DataSnapshot snapshot){
            Map<dynamic, dynamic> DB_value = snapshot.value;
            DB_value.forEach((key,values) {
              Name =values["castName"];
              print(Name); // prints "Michael"
            });
            return Name; 
          });
        }
      

      但您也在循环中多次分配名称。这是故意的吗?否则,您应该使用数组来推送其中的所有项目。

      【讨论】:

        猜你喜欢
        • 2014-08-16
        • 1970-01-01
        • 2013-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多