flutter - 添加到模型时数据丢失

标签 flutter firebase dart firebase-realtime-database provider

我正在从 Firebase 数据库获取数据并将其添加到我的模型类的列表中。我通过打印到控制台来测试传入的数据并且它工作正常,但是一旦我将数据添加到我的模型类,它就会消失。

这是我加载数据的 Provider 类。

import 'package:firebase_database/firebase_database.dart';
import 'package:flutter/material.dart';
import 'package:local_stuffs_notification/apis/fcm.dart';
import 'package:local_stuffs_notification/models/request_model.dart';
import 'package:shared_preferences/shared_preferences.dart';

class IncomingRequest with ChangeNotifier {
  List<RequestModel> _incomingRequests = [];
  IncomingRequest(this._incomingRequests);

  List<RequestModel> get incomingRequest {
    return [..._incomingRequests];
  }

  Future<void> setIncomingRequest(RequestModel requestModel) async {
    try {
      DatabaseReference reference =
          FirebaseDatabase.instance.ref("incomingRequests");
      reference.child(requestModel.id).child(Fcm.getUid()).set(
        {
          "name": requestModel.name.toString(),
          "phone": requestModel.phone.toString(),
          "email": requestModel.email.toString(),
          "fcmToken": requestModel.fcmToken.toString(),
        },
      );
      notifyListeners();
    } catch (error) {
      rethrow;
    }
  }

  Future<void> loadIncomingRequests() async {
    try {
      SharedPreferences preferences = await SharedPreferences.getInstance();
      DatabaseReference reference = FirebaseDatabase.instance
          .ref('incomingRequests/${preferences.getString('userId')!}');
      Stream<DatabaseEvent> stream = reference.onValue;
      stream.listen((DatabaseEvent event) {
        print(event.snapshot.value);
        final data = event.snapshot.value as Map;
        print('data: $data');
        final List<RequestModel> loadedRequest = [];
        data.forEach(
          (key, value) {
            print('requestData: ${value['name']}');
            loadedRequest.add(
              RequestModel(
                id: key.toString(),
                name: value['name'].toString(),
                fcmToken: value['fcmToken'].toString(),
                phone: value['phone'].toString(),
                email: value['email'].toString(),
              ),
            );
            print(loadedRequest);
          },
        );
        _incomingRequests = loadedRequest;
        print('LoadedRequests: $loadedRequest');
        notifyListeners();
      });
      // reference.onValue.listen(
      //   (event) {
      //     if (event.snapshot.value == null) {
      //       return;
      //     }
      //     final data = event.snapshot.value as Map;
      //     final List<RequestModel> loadedRequests = [];
      //     data.forEach(
      //       (key, requestData) {
      //         loadedRequests.add(
      //           RequestModel(
      //             id: key,
      //             name: requestData['name'],
      //             fcmToken: requestData['fcmToken'],
      //             phone: requestData['phone'],
      //             email: requestData['email'],
      //           ),
      //         );
      //       },
      //     );
      //     _incomingRequests = loadedRequests;
      //     notifyListeners();
      // },
      //);
    } catch (error) {
      rethrow;
    }
  }
}

这是我的模型类

class RequestModel {
  final String id;
  final String name;
  final String fcmToken;
  final String phone;
  final String email;

  RequestModel({
    required this.id,
    required this.name,
    required this.fcmToken,
    required this.phone,
    required this.email,
  });
}

I'm getting the data until i added it to loadedRequest List

请帮忙,我在这上面花了好几个小时,但我不知道自己做错了什么。当我打印 loadedRequest 列表时,我得到一个空列表。谢谢。

最佳答案

这些日志没有显示空列表 - 它显示 [Instance of 'RequestModel']。这意味着那里有 一个值,但 Dart 根本不知道如何将 RequestModel 转换为 String 以便它可以打印出来在控制台上。

空列表将简单地打印为 [],如果您有两个值,例如,您将看到 [Instance of 'RequestModel', Instance of 'RequestModel']

要更详细地打印出您的值,您可以覆盖类上的 toString() 方法。

例如:

class RequestModel {
  final String id;
  final String name;
  final String fcmToken;
  final String phone;
  final String email;

  RequestModel({
    required this.id,
    required this.name,
    required this.fcmToken,
    required this.phone,
    required this.email,
  });

  @override
  String toString() => 
    "RequestModel(id: $id, name: $name, fcmToken: $fcmToken, phone: $phone, email: $email)";
}

关于flutter - 添加到模型时数据丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72584567/

相关文章:

android - flutter : How to Fix SuffixIcon at the bottom of the Multiline Enable TextField?

flutter - 滑动面板内的嵌套ScrollView小部件

swift - Firebase Firestore "Could not build module ' nanopb'

xmpp - Dart 有 XMPP api 吗?

flutter - 如何在 flutter 中使用拇指创建一个范围 slider 作为png图像

flutter - 为什么我的 flutter 应用程序中的 FAB 大小很大?

android - 错误:入口点不包含主要功能

arrays - 异步 Swift 调用数组

javascript - 如何更改 Firebase 父节点的名称以启用规则

http - Flutter - 从 url_launcher 获取 HTTP 响应