简体   繁体   中英

Null Check operator used on a null value

when click the showModalBottomSheet it's show on the screen

Null Check operator used on a null value

can anyone help to figure out which is the code error? kindly refer full code as below, TQ!

class ProductContentFirst extends StatefulWidget {
  final List _productContentList;
  const ProductContentFirst(this._productContentList, {Key? key})
      : super(key: key);

  @override
  State<ProductContentFirst> createState() => _ProductContentFirstState();
}

class _ProductContentFirstState extends State<ProductContentFirst> {
  ProductContentItem? _productContent;

  List _attr = [];

  @override
  void initState() {
    super.initState();
    _productContent = widget._productContentList[0];
    this._attr = this._productContent!.attr!;
    //print(this._attr);
  }

  List<Widget>? _getAttrItemWidget(attrItem) {
    List<Widget> attrItemList = [];
    attrItem.list.forEach((item) {
      attrItemList.add(Container(
        margin: EdgeInsets.all(5),
        child: Chip(
          label: Text("${item}"),
          padding: EdgeInsets.all(10),
        ),
      ));
      print (item);
    });
  }
  List<Widget>? _getAttrWidget() {
    List<Widget> attrList = [];
    this._attr.forEach((attrItem) {
      attrList.add(Wrap(
        children: [
          Container(
            width: ScreenAdapter.width(80.0),
            child: Padding(
              padding: EdgeInsets.only(top: ScreenAdapter.height(30.0)),
              child: Text(
                "${attrItem.cate}",
                style: TextStyle(
                  fontWeight: FontWeight.bold,
                ),
              ),
            ),
          ),
          Container(
            width: ScreenAdapter.width(600.0),
            child: Wrap(
              //children: [],
               children: _getAttrItemWidget(attrItem)!,
            ),
          )
        ],
      ));
      print(attrItem.cate);
    });
    //return null;
  }

  _attrBottomSheet() {
    showModalBottomSheet(
        context: context,
        builder: (context) {
          return GestureDetector(
            onTap: () {
              false;
            },
            child: Stack(
              children: [
                Container(
                  padding: EdgeInsets.all(10),
                  child: ListView(
                    children: [
                      Column(
                        children: _getAttrWidget()!,
                      )
                    ],
                  ),
                ),
                Positioned(
                    bottom: 0,
                    width: ScreenAdapter.width(750.0),
                    height: ScreenAdapter.height(100),
                    child: Row(
                      children: [
                        Expanded(
                            flex: 1,
                            child: Container(
                              child: JdButton(
                                color: Color.fromRGBO(253, 1, 0, 0.9),
                                text: "Add Cart",
                                cb: () {
                                  print("Add Cart");
                                },
                              ),
                            )),
                        Expanded(
                            flex: 1,
                            child: Container(
                              child: JdButton(
                                color: Color.fromRGBO(255, 165, 0, 0.9),
                                text: "Buy",
                                cb: () {
                                  print("Buy");
                                },
                              ),
                            )),
                      ],
                    ))
              ],
            ),
          );
        });
  }

  @override
  Widget build(BuildContext context) {
    String pic = Config.domain + this._productContent!.pic!;
    pic = pic.replaceAll("\\", "/");
    return Container(
      padding: EdgeInsets.all(10.0),
      child: ListView(
        children: [
          AspectRatio(
            aspectRatio: 16 / 12,
            child: Image.network(
              "${pic}",
              fit: BoxFit.cover,
            ),
          ),
          Container(
            padding: EdgeInsets.only(top: 7),
            child: Text(
              "${this._productContent!.title}",
              style: TextStyle(
                  color: Colors.black87, fontSize: ScreenAdapter.size(36)),
            ),
          ),
          Container(
            padding: EdgeInsets.only(top: 7),
            child: Text(
              "${this._productContent!.subTitle}",
              style: TextStyle(
                  color: Colors.black54, fontSize: ScreenAdapter.size(28)),
            ),
          ),
          Container(
            padding: EdgeInsets.only(top: 7),
            child: Row(
              children: [
                Expanded(
                  flex: 1,
                  child: Row(
                    children: [
                      Text("Price: "),
                      Text(
                        "${this._productContent!.price}",
                        style: TextStyle(
                            color: Colors.red,
                            fontSize: ScreenAdapter.size(46)),
                      )
                    ],
                  ),
                ),
                Expanded(
                  flex: 1,
                  child: Row(
                    mainAxisAlignment: MainAxisAlignment.end,
                    children: [
                      Text("Old Price: "),
                      Text(
                        "${this._productContent!.oldPrice}",
                        style: TextStyle(
                            color: Colors.black38,
                            fontSize: ScreenAdapter.size(32),
                            decoration: TextDecoration.lineThrough),
                      ),
                    ],
                  ),
                ),
              ],
            ),
          ),
          Container(
            margin: EdgeInsets.only(top: 7),
            height: ScreenAdapter.height(80.0),
            child: InkWell(
              onTap: () {
                _attrBottomSheet();
              },
              child: Row(
                children: [
                  Text(
                    "Select:",
                    style: TextStyle(fontWeight: FontWeight.bold),
                  ),
                  Text("115, Black, XL, 1 pcs")
                ],
              ),
            ),
          ),
          Divider(),
          Container(
            height: ScreenAdapter.height(80.0),
            child: Row(
              children: [
                Text(
                  "Delivery Fees:",
                  style: TextStyle(fontWeight: FontWeight.bold),
                ),
                Text("Free Delivery")
              ],
            ),
          ),
          Divider(),
        ],
      ),
    );
  }
}
class ProductContentModel {
  ProductContentItem? result;

  ProductContentModel({this.result});

  ProductContentModel.fromJson(Map<String, dynamic> json) {
    result = json['result'] != null
        ? new ProductContentItem.fromJson(json['result'])
        : null;
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    if (this.result != null) {
      data['result'] = this.result!.toJson();
    }
    return data;
  }
}

class ProductContentItem {
  String? sId;
  String? title;
  String? cid;
  Object? price;
  String? oldPrice;
  Object? isBest;
  Object? isHot;
  Object? isNew;
  String? status;
  String? pic;
  String? content;
  String? cname;
  List<Attr>? attr;
  String? subTitle;
  Object? salecount;

  ProductContentItem(
      {this.sId,
      this.title,
      this.cid,
      this.price,
      this.oldPrice,
      this.isBest,
      this.isHot,
      this.isNew,
      this.status,
      this.pic,
      this.content,
      this.cname,
      this.attr,
      this.subTitle,
      this.salecount});

  ProductContentItem.fromJson(Map<String, dynamic> json) {
    sId = json['_id'];
    title = json['title'];
    cid = json['cid'];
    price = json['price'];
    oldPrice = json['old_price'];
    isBest = json['is_best'];
    isHot = json['is_hot'];
    isNew = json['is_new'];
    status = json['status'];
    pic = json['pic'];
    content = json['content'];
    cname = json['cname'];
    if (json['attr'] != null) {
      attr = <Attr>[];
      json['attr'].forEach((v) {
        attr!.add(new Attr.fromJson(v));
      });
    }
    subTitle = json['sub_title'];
    salecount = json['salecount'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['_id'] = this.sId;
    data['title'] = this.title;
    data['cid'] = this.cid;
    data['price'] = this.price;
    data['old_price'] = this.oldPrice;
    data['is_best'] = this.isBest;
    data['is_hot'] = this.isHot;
    data['is_new'] = this.isNew;
    data['status'] = this.status;
    data['pic'] = this.pic;
    data['content'] = this.content;
    data['cname'] = this.cname;
    if (this.attr != null) {
      data['attr'] = this.attr!.map((v) => v.toJson()).toList();
    }
    data['sub_title'] = this.subTitle;
    data['salecount'] = this.salecount;
    return data;
  }
}

class Attr {
  String? cate;
  List<String>? list;

  Attr({this.cate, this.list});

  Attr.fromJson(Map<String, dynamic> json) {
    cate = json['cate'];
    list = json['list'].cast<String>();
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['cate'] = this.cate;
    data['list'] = this.list;
    return data;
  }
}

在此处输入图像描述

When the exception was thrown, this was the stack:

\#0  \_ProductContentFirstState.\_getAttrWidget.\<anonymous closure (package:flutter_jdshop/pages/ProductContent/ProductContentFirst.dart:64:54)

Don't use ! without checking null. While the snippet is large, follow these steps.

  • Check null, and then perform operation the place you've used ! . It will be like if(result.=null)result.add(new FocusItemModel;fromJson(v));

  • the children can be children: _getAttrItemWidget(attrItem)??[]

  • You aren't returning widgets from _getAttrItemWidget and others. It will be

 List<Widget> _getAttrItemWidget(attrItem) { // no need to return null
    List<Widget> attrItemList = [];
    attrItem.list.forEach((item) {
       ....
      print (item);
    });
   return  attrItemList;
  }

In short Don't use ! without checking null. or provide default value on null case.

Find more about null-safety .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM