如何在颤振发布方法中修复“未处理的异常:用于空值的空检查运算符”

Posted

技术标签:

【中文标题】如何在颤振发布方法中修复“未处理的异常:用于空值的空检查运算符”【英文标题】:How to fix 'Unhandled Exception: Null check operator used on a null value' in flutter post method 【发布时间】:2021-11-21 12:10:40 【问题描述】:

我是新来的颤振。我正在尝试了解flutter rest api。 当我尝试使用 fullter api(使用 http dart 包)发布数据时,它显示了这个错误。

我试图通过对我的代码进行一些更改来修复它,但我仍然无法修复它。这是我尝试执行的代码。

    型号

     import 'dart:convert';
    
    DataModel dataModelFromJSON(String str) => DataModel.fromJson(jsonDecode(str));
    String dataModelToJson(DataModel data) => json.encode(data.toJson());
    
    class DataModel 
     DataModel(
       required this.name,
       required this.job,
       required this.id,
       required this.createdAt);
    
       String name;
       String job;
       String id;
       String createdAt;
    
    factory DataModel.fromJson(Map<String, dynamic> json) => DataModel(
       name: json['name'],
       job: json['job'],
       id: json['id'],
       createdAt: json['createdAt']);
    
      Map<String, dynamic> toJson() =>
         "name": name, "job": job, "id": id, "createdAt": createdAt;
    
    

    main.dart

     import 'package:flutter/material.dart';
     import 'package:http/http.dart' as http;
    
     import 'DataModel.dart';
    
      void main() 
       runApp(
       MaterialApp(
       home: MyHomePage(),
     ),
     );
    
    
    class MyHomePage extends StatefulWidget 
      @override
      _MyHomePageState createState() => _MyHomePageState();
    
    
    Future<DataModel?> submitData(String name, String job) async 
       var response = await http.post(
       Uri.https('reqres.in', 'api/users'),
       body: "name": name, "job": job,
       );
       var data = response.body;
       print(data);
    
       if (response.statusCode == 201) 
        String responseString = response.body;
        dataModelFromJSON(responseString);
        else
        return null;
       
    
       class _MyHomePageState extends State<MyHomePage> 
          late DataModel _dataModel;
          TextEditingController nameController = TextEditingController();
          TextEditingController jobController = TextEditingController();
    
       @override
       Widget build(BuildContext context) 
         return Scaffold(
          appBar: AppBar(
          title: Center(
           child: Text('HTTP Post'),
           ),
         ),
         body: Container(
           padding: EdgeInsets.all(20.0),
           child: Column(
             children: [
               TextField(
                 decoration: InputDecoration(
                     border: OutlineInputBorder(), hintText: 'Name'),
                 controller: nameController,
               ),
               SizedBox(height: 20.0),
               TextField(
                 decoration: InputDecoration(
                     border: OutlineInputBorder(), hintText: 'Job'),
                 controller: jobController,
               ),
               ElevatedButton(
                 onPressed: () async 
                   String name = nameController.text;
                   String job = jobController.text;
                   DataModel? data = await submitData(name, job);
                   setState(() 
                     _dataModel = data!;
                   );
                 ,
                 child: Text("Submit"),
               )
             ],
           ),
         ),
       );
     
    
    

如果有人可以帮助我解决此问题,我将不胜感激。

【问题讨论】:

【参考方案1】:

您没有在函数中返回数据 在此处添加返回

 return dataModelFromJSON(responseString);

现在你的函数会是这样的

  Future<DataModel?> submitData(String name, String job) async 
       var response = await http.post(
       Uri.https('reqres.in', 'api/users'),
       body: "name": name, "job": job,
       );
       var data = response.body;
       print(data);
    
       if (response.statusCode == 201) 
        String responseString = response.body;
       return dataModelFromJSON(responseString);
        else
        return null;
       

【讨论】:

谢谢@Musab。这是错误。我将此标记为已解决。 :) 欢迎并感谢您将其标记为已解决【参考方案2】:

删除!从这条线_dataModel = data!; 在您的数据模型中,您有这个

    String responseString = response.body;
    dataModelFromJSON(responseString);
    else
    return null;
   

如果请求的状态码不是 201,它将返回 null,它正在使用 !做空检查是导致错误的原因。

【讨论】:

嗨@Aikins,感谢您的回复。我照你说的做了。但“数据”下划线为红色。 我可以打一针吗?

以上是关于如何在颤振发布方法中修复“未处理的异常:用于空值的空检查运算符”的主要内容,如果未能解决你的问题,请参考以下文章

如何修复颤振 lib/main.dart 错误

如何在颤振中修复“Android许可证状态未知”

如何修复颤振医生不识别安卓手机

双击按钮时如何修复颤振中的多个导航

如何修复颤振中的“回复已提交的错误”?

如何修复调用 API 时卡住的颤振应用程序(仅限发布版本)