Оператор проверки Null, используемый для нулевого значения, когда я определил модель конкретного списка, используя нулевую безопасность во флаттере

#flutter #dart #flutter-listview #dart-null-safety #null-check

Вопрос:

Я хочу проверить, пуст ли список, затем показать какое-нибудь изображение, и если это не так, я хочу показать содержимое списка, но я получаю ошибку при проверке, пуст ли список.Это мой класс моделей

 import 'dart:convert';

class ProductModel {
  ProductModel({
    this.name,
    this.description,
    this.sellerId,
    this.published,
    this.origin,
    this.weight,
    this.material,
    this.photoUrl,
    this.discount,
    this.price,
    this.quantity,
    this.sizes
  });

  String? name;
  String? description;
  String? sellerId;
  String? published;
  String? origin;
  String? weight;
  String? material;
  List<String>? photoUrl=[];
  int? discount;
  List<String>? sizes=[];
  List<String>? quantity=[];
  List<String>? price=[];

  factory ProductModel.fromRawJson(String str) => ProductModel.fromJson(json.decode(str));

  String toRawJson() => json.encode(toJson());

  factory ProductModel.fromJson(Map<String, dynamic> json) => ProductModel(
    name: json["name"] == null ? null : json["name"],
    description: json["description"] == null ? null : json["description"],
    sellerId: json["sellerId"] == null ? null : json["sellerId"],
    published: json["published"] == null ? null : json["published"],
    origin: json["origin"] == null ? null : json["origin"],
    weight: json["weight"] == null ? null : json["weight"],
    material: json["material"] == null ? null : json["material"],
    photoUrl: json["photoUrl"] == null ? null : List<String>.from(json["photoUrl"].map((x) => x)),
    discount: json["discount"] == null ? null : json["discount"],
    sizes: json["sizes"] == null ? null : List<String>.from(json["sizes"].map((x) => x)),
    price: json["price"] == null ? null : List<String>.from(json["price"].map((x) => x)),
    quantity: json["quantity"] == null ? null : List<String>.from(json["quantity"].map((x) => x)),
  );

  Map<String, dynamic> toJson() => {
    "name": name == null ? null : name,
    "description": description == null ? null : description,
    "sellerId": sellerId == null ? null : sellerId,
    "published": published == null ? null : published,
    "origin": origin == null ? null : origin,
    "weight": weight == null ? null : weight,
    "material": material == null ? null : material,
    "photoUrl": photoUrl == null ? null : List<String>.from(photoUrl!.map((x) => x)),
    "discount": discount == null ? null : discount,
    "sizes": sizes == null ? null : List<dynamic>.from(sizes!.map((x) => x)),
    "price": price == null ? null : List<dynamic>.from(price!.map((x) => x)),
    "quantity": quantity == null ? null : List<dynamic>.from(quantity!.map((x) => x)),
  };
}
 

Но я получаю оператор проверки null, используемый для нулевого значения. Может кто-нибудь, пожалуйста, указать, что здесь происходит не так. Спасибо

Это мое использование кода:

 Padding(
              padding: const EdgeInsets.all(8.0),
              child: Container(
                decoration: BoxDecoration(
                    border: Border.all(
                      color: Colors.orange,
                    ),
                    borderRadius: BorderRadius.circular(20)),
                height: MediaQuery.of(context).size.height / 2.5,
                width: MediaQuery.of(context).size.width - 100,
                child: addProductCtrl.product.sizes!.length > 0
                    ? Padding(
                        padding: const EdgeInsets.all(8.0),
                        child: GetBuilder<AddProductCtrl>(
                            id: editDetails,
                            builder: (_) {
                              return new ListView.builder(
                                  scrollDirection: Axis.vertical,
                                  itemCount: addProductCtrl.product.sizes!.length,
                                  itemBuilder: (_, index) => Row(
                                        mainAxisAlignment:
                                            MainAxisAlignment.spaceBetween,
                                        children: [
                                          Padding(
                                            padding:
                                                const EdgeInsets.all(8.0),
                                            child: Text(
                                                addProductCtrl.product.sizes![index],
                                                style: TextStyle(
                                                    fontSize: 25)),
                                          ),
                                          Padding(
                                            padding:
                                                const EdgeInsets.all(8.0),
                                            child: Text(
                                                "Rs.${addProductCtrl.product.price![index]}",
                                                style: TextStyle(
                                                    fontSize: 25)),
                                          ),
                                          Padding(
                                            padding:
                                                const EdgeInsets.all(8.0),
                                            child: Text(
                                                addProductCtrl.product.quantity![index],
                                                style: TextStyle(
                                                    fontSize: 25)),
                                          ),
                                        ],
                                      ));
                            }),
                      )
                    : Padding(
                        padding: const EdgeInsets.all(8.0),
                        child: Center(
                            child: Text("Add Details ",
                                style: TextStyle(fontSize: 25))),
                      ),
              ),
            ),
 

изображение ошибки

Комментарии:

1. Пожалуйста, опубликуйте свой код в виде текста вместо использования скриншотов.

2. конечно, ты можешь хорошенько посмотреть сейчас

3. Можете ли вы также опубликовать полное сообщение об ошибке? Это также должно указывать на то, в какой строке вашего кода у вас возникла проблема.

4. хорошо, это в addProductCtrl.product.sizes! .длина

5. Это sizes null потому, что json[«размеры»] вернулся null , когда вы это сделали sizes: json["sizes"] == null ? null : List<String>.from(json["sizes"].map((x) => x)), . Я должен добавить, что ваш ProductModel класс-это беспорядок, и его можно было бы написать намного эффективнее. Я также сомневаюсь, что все поля в вашем JSON являются необязательными, и поэтому вам нужно, чтобы все переменные были обнуляемыми?

Ответ №1:

Основываясь на примере JSON, я переписал ваш синтаксический анализатор JSON на следующий, который также безопасен для null:

 class ProductModel {
  ProductModel({
    required this.name,
    required this.description,
    required this.sellerId,
    required this.published,
    required this.origin,
    required this.weight,
    required this.material,
    required this.photoUrl,
    required this.discount,
    required this.price,
    required this.quantity,
    required this.sizes,
  });

  String name;
  String description;
  String sellerId;
  String published;
  String origin;
  String? weight;
  String? material;
  List<String> photoUrl;
  int? discount;
  List<String> sizes;
  List<String> price;
  List<String> quantity;

  factory ProductModel.fromRawJson(String str) =>
      ProductModel.fromJson(json.decode(str) as Map<String, dynamic>);

  String toRawJson() => json.encode(toJson());

  factory ProductModel.fromJson(Map<String, dynamic> json) => ProductModel(
        name: json["name"] as String,
        description: json["description"] as String,
        sellerId: json["sellerId"] as String,
        published: json["published"] as String,
        origin: json["origin"] as String,
        weight: json["weight"] as String?,
        material: json["material"] as String?,
        photoUrl: (json["photoUrl"] as List?)?.cast<String>().toList() ?? [],
        discount: json["discount"] as int?,
        sizes: (json["sizes"] as List?)?.cast<String>().toList() ?? [],
        price: (json["price"] as List?)?.cast<String>().toList() ?? [],
        quantity: (json["qty"] as List?)?.cast<String>().toList() ?? [],
      );

  Map<String, dynamic> toJson() => <String, dynamic>{
        "name": name,
        "description": description,
        "sellerId": sellerId,
        "published": published,
        "origin": origin,
        if (weight != null) "weight": weight,
        if (material != null) "material": material,
        if (photoUrl.isNotEmpty) "photoUrl": photoUrl,
        if (discount != null) "discount": discount,
        if (sizes.isNotEmpty) "sizes": sizes,
        if (price.isNotEmpty) "price": price,
        if (quantity.isNotEmpty) "qty": quantity,
      };
}

const jsonInput = '''{
  "name": "test",
  "description": "",
  "sellerId": "",
  "published": "",
  "origin": "",
  "weight": "",
  "material": "",
  "photoUrl": [],
  "discount": 10,
  "size": [],
  "price": [],
  "qty": []
}
''';

void main() {
  print(ProductModel.fromRawJson(jsonInput).toJson());
  // {name: test, description: , sellerId: , published: , origin: , weight: , material: , discount: 10}
}
 

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