如何解决"Type Null is not a subtype of type ..."错误?



当我运行下面的代码时,它会将这个错误打印到屏幕上,我不知道为什么:

类型Null不是类型int 的子类型

这是我的API数据模型类:

class data {
final int id;
final String email;
final String first_name;
final String last_name;
final String avatar;
data({
required this.id,
required this.email,
required this.first_name,
required this.last_name,
required this.avatar,
});
factory data.fromJson(Map<String, dynamic> json) {
return data(
id: json['id'],
email: json['email'],
first_name: json['first_name'],
last_name: json['last_name'],
avatar: json['avatar'],
);
}
}

API调用部分(此部分为调用(:

import 'dart:async';
import 'dart:convert';
import 'package:api_data/models/datamodel.dart';
import 'package:http/http.dart' as http;
class ApiManager {
Future<data> fetchAlbum() async {
final response =
await http.get(Uri.parse('https://reqres.in/api/users?page=2'));
if (response.statusCode == 200) {
// If the server did return a 200 OK response,
// then parse the JSON.
return data.fromJson(jsonDecode(response.body));
} else {
// If the server did not return a 200 OK response,
// then throw an exception.
throw Exception('Failed to load album');
}
}
}

主要部件

import 'package:api_data/models/datamodel.dart';
import 'package:api_data/network/api_data.dart';
import 'package:flutter/material.dart';
class Testpage extends StatefulWidget {
const Testpage({Key? key}) : super(key: key);
@override
_TestpageState createState() => _TestpageState();
}
class _TestpageState extends State<Testpage> {
late Future<data> futureAlbum;
@override
void initState() {
super.initState();
futureAlbum = ApiManager().fetchAlbum();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Test2'), centerTitle: true),
body: Center(
child: FutureBuilder<data>(
future: futureAlbum,
builder: (context, snapshot) {
if (snapshot.hasData) {
return Text(snapshot.data!.email.toString());
} else if (snapshot.hasError) {
return Text("${snapshot.error}");
}
// By default, show a loading spinner.
return CircularProgressIndicator();
},
),
),
);
}
}

我不明白为什么这不能正常工作。

您正在项目中启用Null安全的情况下运行。您已经在数据模型类中声明了所有字段为必填字段

非null字段您的API响应缺少字段或具有空值,这就是您面临此问题的原因。

解决方案:int?替换int(使字段可选将解决问题(。

您可以使用Helper类。

class TypesHelper{
static int toInt(num val){
try{
if(val == null){
return 0;
}
if(val is int){
return val;
}else{
return val.toInt();
}
}catch(error){
print('Error');
return 0;
}

}

然后强制转换为int。在您的型号级上

id: TypesHelper.toInt(json['id']),

不要使用late Future<data> futureAlbum;

使用Future<data>? futureAlbum;

在我看来,您的一些json响应可能没有id,所以它显示了错误。您应该检查您得到的json响应,看看它是否有id。

相关内容

最新更新