如何修复 flutter 中的 "Unhandled Exception: Null check operator used on a null value" 错误?

How to fix "Unhandled Exception: Null check operator used on a null value" error in flutter?

我是 flutter 新手。

我想通过 rest API(使用 post 方法)将数据从前端传递到 node.js 后端。但是在执行应用程序时显示以下错误。

这是我到目前为止编写的代码。我试图找出错误是什么,但不幸的是我找不到。有人可以帮我解决这个问题吗?

  1. 模型文件

    DataModel dataModelFromJSON(String str) => DataModel.fromJson(jsonDecode(str));
    String dataModelToJson(DataModel data) => json.encode(data.toJson());
    
    class DataModel {
       DataModel({required this.title, required this.id});
    
       String title;
       String id;
    
       factory DataModel.fromJson(Map<String, dynamic> json) =>
           DataModel(title: json['title'], id: json['id']);
    
       Map<String, dynamic> toJson() => {"name": title, "id": id};
     }
    
  2. 页面出现错误

    class PurchaseOrder extends StatefulWidget {
      @override
      _PurchaseOrderState createState() => _PurchaseOrderState();
    }
    
    Future<DataModel?> submitData(String title) async {
      var response = await http.post(
        Uri.http('176.12.10.0:8020', 'order/create'),
        body: {"title": title},
      );
      print(title);
      var data = response.body;
      print(data);
    
      if (response.statusCode == 201) {
        String responseString = response.body;
        return dataModelFromJSON(responseString);
      } else
        return null;
    }
    
    class _PurchaseOrderState extends State<PurchaseOrder> {
      String today = DateFormat('yMd').format(DateTime.now());
      late DataModel _dataModel;
      TextEditingController titleController = TextEditingController();
    
      @override
      Widget build(BuildContext context) {
        final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
        return Container(
          child: Column(
            children: [
              TextFormField(
                decoration: const InputDecoration(
                  hintText: 'Enter your email',
                ),
                controller: titleController,
              ),
               Expanded(
                 child: Padding(
                   padding: const EdgeInsets.all(8.0),
                   child: OutlinedButton(
                     onPressed: () async {
                       String title = titleController.text;
                       DataModel? data = await submitData(title);
                       setState(() {
                         _dataModel = data!;
                       });
                     },
                     child: Text("Submit"),
                   ),
                 ),
               ),
           ],
         ),
       );
     }
    }
    

希望您能帮助解决这个问题。 谢谢

已编辑: 我对代码进行了以下更改。错误消失了。但是数据还没有传递到后端。我能做什么。

我变了,

_dataModel = data!;

if (data != null) {
   _dataModel = data;
}

您的代码中唯一的空检查运算符是 _dataModel = data!; 这意味着您的 submitData 方法返回了传递给数据的空值。或者,当您放置空检查运算符时,您必须确保变量不为空。

为避免此错误,您可以检查数据是否为空,如果为真则传递另一个值:

_dataModel = data ?? otherValue

该错误意味着您在代码中的某处使用不可为 null 的类型执行某些操作,但该值实际上为 null。 例如,当您使用 data! 时,您是在告诉编译器 data 不会为空,但实际上是。

如果 data 为空,您可以使用 data ?? someValue 进行回退。

我也可以解决“数据未通过问题”。

我做了什么?

我更改了 post 请求,

var response = await http.post(
Uri.http('176.12.10.0:8020', 'order/create'),
body: {"title": title},
);

var response = await http.post(
Uri.parse('http://176.12.10.0:8020/order/create'),
    headers: {'Content-Type': 'application/json'},
    body: jsonEncode({"title": title}),
);