#flutter #rest #mobile #flutter-dependencies
Вопрос:
Я новичок в трепете. Я пытаюсь узнать об api rest flutter. Когда я пытаюсь опубликовать данные с помощью api fullter(с помощью пакета 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}; }
- главная.дротик
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. Можно мне сделать укол?