Как я могу получить эту переменную в «тогда»? - PullRequest
1 голос
/ 08 июня 2019

Я беру данные из базы данных, есть данные, но я не могу получить доступ к переменной.Не могли бы вы мне помочь ?Заранее спасибо.

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

class Models {
  var data;
  Map jsondata;

  Future<Map<dynamic,dynamic>> where() async{
    await Firestore.instance
    .collection('musteri')
    .where("name", isEqualTo: "Lion")
    .snapshots()
    .listen((data) =>
        data.documents.map( (DocumentSnapshot document) {
            this.jsondata = document.data;
            print(this.jsondata);
           // There is data here. when i use print(this.jsondata); , data apper in the terminal.
        }).toString(),
      );

      print(this.jsondata); // this is an empty data.

    return jsondata;
  }
}

1 Ответ

0 голосов
/ 08 июня 2019

Первое, что нужно отметить, это то, что когда вы запускаете Firebase Query, тип ответа, который вы получите, будет QuerySnapshot, что может быть легче понять, если вы думаете о них как List из DocumentSnapshot.s.

Таким образом, вы можете перефразировать ваш код следующим образом

QuerySnapshot snapshot = await Firestore.instance
    .collection('musteri')
    .where("name", isEqualTo: "Lion")
    .getDocuments();

Теперь, когда у вас есть моментальный снимок запроса, вы можете выполнить его итерацию и получить желаемый DocumentSnapshot.

snapshot.documents.forEach((document){
  jsondata = document.data;
});

И тогда вы можете вернуть jsondata.Но имейте в виду, что этот jsondata будет последним элементом в QuerySnapshot.

Так что я думаю, что вам также нужно будет перефразировать ваш метод, чтобы вернуть List<Map<String, String>> вместо Map<String, String>

В целом ваша функция будет выглядеть так:

Future<Map<dynamic, dynamic>> where() async {

  QuerySnapshot snapshot = await Firestore.instance
      .collection('musteri')
      .where("name", isEqualTo: "Lion")
      .getDocuments();

  snapshot.documents.forEach((document){
    jsondata = document.data;
  });

  return jsonData;
}
...