Добавление нескольких элементов в список в flutter

#list #flutter #dart

Вопрос:

Я новичок в кодировании в целом, и сейчас я работаю в flutter. Мне удалось успешно добавить объекты с одной строкой в список, но у меня возникли проблемы с добавлением объекта с несколькими строками в список. Мне бы хотелось получить некоторые рекомендации, если кто-нибудь сможет помочь!

Это моя модель

 import 'dart:convert';

import 'package:json_annotation/json_annotation.dart';

@JsonSerializable(anyMap: true, explicitToJson: true)
class Product {
  String productName;
  String productDescription;

  Product(this.productName, this.productDescription);

  factory Product.fromJson(Map<String, dynamic> json) =>
    _$ProductFromJson(json);
  Map<String, dynamic> toJson() => _$ProductToJson(this);
}

Product _$ProductFromJson(Map<String, dynamic> json) {
  return Product(
    json['product name'] as String,
    json['product description'] as String,
  );
}

Map<String, dynamic> _$ProductToJson(Product instance) => <String, dynamic>{
      'product name': instance.productName,
      'product description': instance.productDescription,
    };

//trying to add Product strings into products
class UserData {
  ...
  final List<dynamic> accommodations; //successfully able to add single strings to list
  final List<dynamic> products; //unable to add multiple string objects to this list
  ...

  UserData(
      {...
      this.accommodations,
      this.products
      ...}
  );

  Map<String, dynamic> toJson() => {"products": this.products};
}
 

Вот функция базы данных для подключения ее к firestore

   Future addProduct(List products) async {
    Map<String, dynamic> productMap = {
      'products': products.map((product) => products.toList())
    };
    await userCollection.doc(uid).update(productMap);
  }
 

Ожидание, которое я редактировал несколько раз, либо выдает ошибку «ArgumentError (Недопустимый аргумент: экземпляр» Продукта»)», либо «_TypeError (тип» _InternalLinkedHashMap<динамический, динамический> «не является подтипом типа» Карта<динамическая, динамическая><Строка, объект>»)»

Наконец, вот событие onPressed, которое я пытаюсь использовать для вставки двух строковых значений в список продуктов.

 String _currentProductName;
String _currentProductDescription;
 

они подключены к текстовым полям

 onChanged: (val) {
 setState(() => _currentProductName = val);
},
onChanged: (val) {
 setState(() => _currentProductDescription = val);
},
 

и нажата, которую я также пытался изменить несколько раз

 RaisedButton(onPressed: () async {
 userData.products.add(Product(
  _currentProductName,
  _currentProductDescription));
 await DatabaseService(uid: user.uid).addProduct(userData.products);
}),
 

Спасибо!

Ответ №1:

Firestore принимает карты только для обновлений, поэтому вам нужно сопоставить свой продукт с его представлением на карте. Я на мобильном телефоне, так что пощадите меня за форматирование, но это выглядело бы примерно так

products.map((p) => p.toMap()).ToList()