首页 > 解决方案 > 使用自定义对象将 Firebase 中的地图数据检索到 Flutter

问题描述

我正在尝试从映射的 firebase 中获取一些数据,如下例所示。但我不知道该怎么做。我还希望能够通过颤振创建这些数据,并在每次有人进行身份验证时使用更新!

这是我创建用户的 auth.dart

    Future emailPassword(String email, String password) async {
    try {
      UserCredential result = await _auth.createUserWithEmailAndPassword(
          email: email, password: password);
      User user = result.user;

      await DatabaseService(uid: user.uid).updateUserData(
        name: 'Nome da Ficha',
        minLife: 0,
        maxLife: 0,
        minSanity: 0,
        maxSanity: 0,
        diceValue: 0,
        diceSuccess: '',
        imgUrl: [
          'http://pm1.narvii.com/7061/94a9e73f84c28d8c8cb26d1aca69edec13075dfer1-500-500v2_00.jpg',
          'foto1',
          'foto2',
          'foto3',
          'foto4',
          'foto5',
          'foto6',
          'foto7'
        ],
        imageState: 0,
      );
      return _userFromUser(user);
    } catch (err) {
      print(err.toString());
      return null;
    }
  }

用户模型:

class UserModel {
  final String uid;

  UserModel({this.uid});
}

class UserData {
  final String uid;
  final String name;
  final int minLife;
  final int maxLife;
  final int minSanity;
  final int maxSanity;
  final int diceValue;
  final String diceSuccess;
  final List<dynamic> imgUrl;
  final int imageState;

  UserData({
    this.uid,
    this.name,
    this.minLife,
    this.maxLife,
    this.minSanity,
    this.maxSanity,
    this.diceValue,
    this.diceSuccess,
    this.imgUrl,
    this.imageState,
  });
}

这是我的数据库服务:

class DatabaseService {
  final String uid;
  DatabaseService({this.uid});

  //Referencia para uma Coleção específica
  final CollectionReference userSheet =
      FirebaseFirestore.instance.collection('userSheet');

  Future updateUserData({
    String name,
    int minLife,
    int maxLife,
    int minSanity,
    int maxSanity,
    int diceValue,
    String diceSuccess,
    List<dynamic> imgUrl,
    int imageState,
  }) async {
    return await userSheet.doc(uid).set({
      'name': name,
      'minLife': minLife,
      'maxLife': maxLife,
      'minSanity': minSanity,
      'maxSanity': maxSanity,
      'diceValue': diceValue,
      'diceSuccess': diceSuccess,
      'imgUrl': imgUrl,
      'imageState': imageState,
    });
  }

  // retorna um snapshot, mas mapeado para UserData
  UserData _userDataFromSnapshot(DocumentSnapshot snapshot) {
    return UserData(
      uid: uid,
      name: snapshot['name'],
      minLife: snapshot['minLife'],
      maxLife: snapshot['maxLife'],
      minSanity: snapshot['minSanity'],
      maxSanity: snapshot['maxSanity'],
      diceValue: snapshot['diceValue'],
      diceSuccess: snapshot['diceSuccess'],
      imgUrl: List.from(snapshot['imgUrl']),
      imageState: snapshot['imageState'],
    );
  }

  //lista de todas as fichas dos usuários retornando em Stream

  List<UserData> _allUserDataFromSnapshot(QuerySnapshot snapshot) {
    return snapshot.docs.map((doc) {
      return UserData(
        name: doc['name'] ?? 'Nome da Ficha',
        minLife: doc['minLife'] ?? 0,
        maxLife: doc['maxLife'] ?? 0,
        minSanity: doc['minSanity'] ?? 0,
        maxSanity: doc['maxSanity'] ?? 0,
        diceSuccess: doc['diceSuccess'] ?? '',
        diceValue: doc['diceValue'] ?? 0,
        imgUrl: List.from(doc['imgUrl']) ?? ['0'],
        imageState: doc['imageState'] ?? 0,
      );
    }).toList();
  }

  //Obter Strams de uma Query do Firestore Collection

  Stream<List<UserData>> get allUserData {
    return userSheet.snapshots().map(_allUserDataFromSnapshot);
  }

  //Obter Streams do Usuário (sem ser habilidades)
  Stream<UserData> get userData {
    return userSheet.doc(uid).snapshots().map(_userDataFromSnapshot);
  }
}

如何使用在颤振中映射的数据?(点击这里查看IMG)

标签: firebaseflutter

解决方案


推荐阅读