Как исправить «Необработанное исключение: оператор проверки Null, используемый для нулевого значения» в методе flutter post

#flutter #rest #mobile #flutter-dependencies

Вопрос:

Я новичок в трепете. Я пытаюсь узнать об api rest flutter. Когда я пытаюсь опубликовать данные с помощью api fullter(с помощью пакета http dart), он показывает мне эту ошибку.

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

Я попытался исправить это, внеся некоторые изменения в свой код, но все еще не смог это исправить. Вот код, который я пытаюсь выполнить.

  1. Модель
      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};
    }
     
  2. главная.дротик
      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;
       }
 

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

1. Спасибо @Musab. Это была ошибка. Я отмечаю это как решенное. 🙂

2. добро пожаловать и спасибо, что отметили это решение

Ответ №2:

Уберите ! из этой строки _dataModel = data!; В вашей модели данных у вас есть это

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

Что вернет значение null, если код состояния запроса не 201, который он использует для этого ! Выполнить проверку на ноль-это то, что вызывает ошибку.

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

1. Привет @Aikins, спасибо за ваш ответ. Я сделал, как ты сказал. Но «данные» подчеркнуты красным цветом.

2. Можно мне сделать укол?