Модель с вложенной картой для установки в Firebase (json_annotation.dart) - PullRequest
6 голосов
/ 18 января 2020

Моя модель базы данных Firebase выглядит следующим образом:

dbRef
    |___userId
             |____Cars
                  |____Alfa_Romeo
                  |             |____Year: 1992
                  |             |____Price: 10000
                  |__________Audi
                  |             |____Year: 1998
                  |             |____Price: 3000
                  |___________BMW
                                |____Year: 2001
                                |____Price: 7000

Тогда у меня есть Class Car, который выглядит как

import 'package:json_annotation/json_annotation.dart';


part 'car.g.dart';

/// An annotation for the code generator to know that this class needs the
/// JSON serialization logic to be generated.
@JsonSerializable()

class Car {
  Carta(this.model, this.details);

  String model;
  List details;

  factory Car.fromJson(Map<String, dynamic> json) => _$CarFromJson(json);

  Map<String, dynamic> toJson() => _$CarToJson(this);
}

Теперь, когда я устанавливаю данные в Firebase, я получаю это:

dbRef
    |___userId
              |____Cars
                      |____Alfa_Romeo
                      |____Year: 1992
                      |____Price: 10000

... и я хочу, чтобы это было похоже на модель из первой диаграммы. Как я могу вложить детали в «модель» ребенка? Может ли кто-нибудь помочь мне с этим, пожалуйста?

РЕДАКТИРОВАТЬ: Просто чтобы убедиться, что я ясно, что я хочу. Этот код взят из примера команды Flutter docs :

import 'address.dart';
import 'package:json_annotation/json_annotation.dart';
part 'user.g.dart';

@JsonSerializable(explicitToJson: true)
class User {
  String firstName;
  Address address;

  User(this.firstName, this.address);

  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
  Map<String, dynamic> toJson() => _$UserToJson(this);
}

Этот код генерирует следующий вывод:

name: John, address: {street: My st., city: New York}}

И я хочу, чтобы Джон стал ключом Child и адресом, который будет вложен внутрь, потому что может быть более одного массива адреса. Поле адреса должно стать ключом (оно будет уникальным), и тогда оно будет иметь карту предметов, и у каждого предмета будет только 2 поля с описанием и ценой.

1 Ответ

3 голосов
/ 18 января 2020

Я предлагаю разбить детали на их собственный класс, как в этом примере, https://flutter.dev/docs/development/data-and-backend/json#generating -код-для-вложенных-классов .

Редактировать

Вместо того, чтобы использовать JsonSerializable, попробуйте сопоставить модель вручную и скопировать оставшиеся свойства на другую карту.

class Car {
  Car({this.model, this.details});

  String model;
  Map<String, dynamic> details;

  factory Car.fromJson(Map<String, dynamic> json) {
    Map<String, dynamic> details = Map<String, dynamic>.from(json);
    details.remove('model');

    return new Car(
      model: json['model'],
      details: details
    );
  }

  Map<String, dynamic> toJson() {
    Map<String, dynamic> json = Map<String, dynamic>.from(details);
    json['model'] = model;

    return json;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...