下面是我的json的样子
{
"data": {
"id": 2,
"email": "floki@mail.com",
"first_name": "Valjakudze",
"last_name": "shipment",
"avatar": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7e/Circle-icons-profile.svg/1024px-Circle-icons-profile.svg.png"
}
}我正在使用Dio和以下两个类来进行回复。
响应类
import 'package:json_annotation/json_annotation.dart';
import 'package:json_crud/classes/user.dart';
part 'user_response.g.dart';
@JsonSerializable()
class UserResponse{
@JsonKey(name: "data")
User? user;
UserResponse();
factory UserResponse.fromJson(Map<String, dynamic> json) => _$UserResponseFromJson(json);
Map<String, dynamic> toJson() => _$UserResponseToJson(this);
}下面是我的UserClass
import 'package:json_annotation/json_annotation.dart';
part 'user.g.dart';
@JsonSerializable()
class User{
@JsonKey(name: "id")
late int id;
@JsonKey(name: "email")
late String email;
@JsonKey(name: "first_name")
late String firstName;
@JsonKey(name: "last_name")
late String lastName;
@JsonKey(name: "avatar")
late String avatar;
User();
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
Map<String, dynamic> toJson() => _$UserToJson(this);
}下面是我的UserProfileScreen,我应该在这里设置文本
import 'dart:developer';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:json_crud/classes/user.dart';
import 'package:json_crud/classes/user_response.dart';
import 'package:json_crud/http_service.dart';
class UserProfile extends StatefulWidget {
const UserProfile({Key? key}) : super(key: key);
@override
_UserProfileState createState() => _UserProfileState();
}
class _UserProfileState extends State<UserProfile> {
HttpService? httpService;
UserResponse? userResponse;
User? user;
bool isLoading = false;
Future getUser () async {
Response response;
try {
log("TryCatchCalled");
response = await httpService!.getRequest("/b/BGT5");
if(response.statusCode == 200){
setState(() {
userResponse = UserResponse.fromJson(response.data);
user = userResponse!.user;
log("ResponseStatusCode200 ${response.statusCode}");
});
}else{
log("ResponseStatusCode ${response.statusCode}");
}
} on Exception catch (e) {
isLoading = false;
log("GetUserResponseException ${e.toString()}");
}
}
@override
void initState() {
httpService = HttpService();
userResponse = UserResponse();
user = User();
getUser();
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("User Profile"),
),
body: isLoading
? const Center(child: CircularProgressIndicator())
: Container(
width: double.infinity,
child: Column(
children: [
Image.network(user!.avatar),
Container(height: 16,),
Text("Hello, ${user!.firstName} ${user!.lastName}")
],
),
),
);
}
}我得到了LateInitializationError:字段'avatar‘还没有初始化错误
下面是我通过更改我的用户类尝试过的内容
import 'package:json_annotation/json_annotation.dart';
part 'user.g.dart';
@JsonSerializable()
class User{
@JsonKey(name: "id")
int? id;
@JsonKey(name: "email")
String? email;
@JsonKey(name: "first_name")
String? firstName;
@JsonKey(name: "last_name")
String? lastName;
@JsonKey(name: "avatar")
String? avatar;
User();
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
Map<String, dynamic> toJson() => _$UserToJson(this);
}但是,当我在后面更改类变量时,会出现一个新的错误:参数类型“String?”不能分配参数类型'String‘,因为'String?’是可空的,而“字符串”不是。Image.network(用户!.avatar)
下面是完整的错误日志
======== Exception caught by widgets library =======================================================
The following LateError was thrown building UserProfile(dirty, state: _UserProfileState#c6357):
LateInitializationError: Field 'avatar' has not been initialized.
The relevant error-causing widget was:
UserProfile UserProfile:file:///C:/Users/Emman/AndroidStudioProjects/json_crud/lib/main.dart:28:19
When the exception was thrown, this was the stack:
#0 User.avatar (package:json_crud/classes/user.dart)
#1 _UserProfileState.build (package:json_crud/screens/user_profile.dart:81:19)
#2 StatefulElement.build (package:flutter/src/widgets/framework.dart:4705:27)
#3 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4588:15)
#4 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4763:11)
#5 Element.rebuild (package:flutter/src/widgets/framework.dart:4311:5)
#6 ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4566:5)
#7 StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4754:11)
#8 ComponentElement.mount (package:flutter/src/widgets/framework.dart:4561:5)
... Normal element mounting (169 frames)
#177 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3631:14)
#178 MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:6261:36)
#179 MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:6272:32)
... Normal element mounting (391 frames)
#570 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3631:14)
#571 Element.updateChild (package:flutter/src/widgets/framework.dart:3383:18)
#572 RenderObjectToWidgetElement._rebuild (package:flutter/src/widgets/binding.dart:1198:16)
#573 RenderObjectToWidgetElement.mount (package:flutter/src/widgets/binding.dart:1167:5)
#574 RenderObjectToWidgetAdapter.attachToRenderTree.<anonymous closure> (package:flutter/src/widgets/binding.dart:1112:18)
#575 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2531:19)
#576 RenderObjectToWidgetAdapter.attachToRenderTree (package:flutter/src/widgets/binding.dart:1111:13)
#577 WidgetsBinding.attachRootWidget (package:flutter/src/widgets/binding.dart:944:7)
#578 WidgetsBinding.scheduleAttachRootWidget.<anonymous closure> (package:flutter/src/widgets/binding.dart:924:7)
(elided 11 frames from class _RawReceivePortImpl, class _Timer, dart:async, and dart:async-patch)
====================================================================================================我怎么解决这件事
发布于 2022-01-09 21:53:08
它显示了更改后的错误来自何处:
类型'String?‘是可空的,而“String”不是。
所以,当您像这样键入变量firstName:String? firstName;时,编译器对firstName = null非常满意。
当您像String firstName;一样键入它时,那么它的类型"String" _prevents就不会变成null。
也许您在某个地方输入了应该是String? (或由if获取)的内容,如String,f.e。在……里面
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
发布于 2022-01-10 07:32:29
在init方法中调用getUser,但是由于它是异步的并返回一个未来,所以需要等待。否则,当您的构建方法被调用时,您的代码将无法完成,并且您的变量仍然被设置为它们的默认值(这意味着您的late变量从未在这些实例上被初始化过,并且得到了所看到的错误)。
由于不能在本身不是await的方法中使用async关键字(而initState不是),所以需要找到一种解决方法。最常见的是使用FutureBuilder小部件。
您可以在这里找到一个通用设置的好例子:What is a Future and how do I use it?
https://stackoverflow.com/questions/70645029
复制相似问题