首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LateInitializationError:字段'avatar‘尚未初始化

LateInitializationError:字段'avatar‘尚未初始化
EN

Stack Overflow用户
提问于 2022-01-09 20:02:02
回答 2查看 316关注 0票数 0

下面是我的json的样子

代码语言:javascript
复制
{
    "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和以下两个类来进行回复。

响应类

代码语言:javascript
复制
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

代码语言:javascript
复制
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,我应该在这里设置文本

代码语言:javascript
复制
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‘还没有初始化错误

下面是我通过更改我的用户类尝试过的内容

代码语言:javascript
复制
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)

下面是完整的错误日志

代码语言:javascript
复制
======== 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)
====================================================================================================

我怎么解决这件事

EN

回答 2

Stack Overflow用户

发布于 2022-01-09 21:53:08

它显示了更改后的错误来自何处:

类型'String?‘是可空的,而“String”不是。

所以,当您像这样键入变量firstNameString? firstName;时,编译器对firstName = null非常满意。

当您像String firstName;一样键入它时,那么它的类型"String" _prevents就不会变成null。

也许您在某个地方输入了应该是String? (或由if获取)的内容,如String,f.e。在……里面

factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);

票数 0
EN

Stack Overflow用户

发布于 2022-01-10 07:32:29

在init方法中调用getUser,但是由于它是异步的并返回一个未来,所以需要等待。否则,当您的构建方法被调用时,您的代码将无法完成,并且您的变量仍然被设置为它们的默认值(这意味着您的late变量从未在这些实例上被初始化过,并且得到了所看到的错误)。

由于不能在本身不是await的方法中使用async关键字(而initState不是),所以需要找到一种解决方法。最常见的是使用FutureBuilder小部件。

您可以在这里找到一个通用设置的好例子:What is a Future and how do I use it?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70645029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档