Json 空安全后在 flutter 中解析

Json parsing in flutter after null safety

我有一个简单的 json,我想显示日出和日落时间。

我的Json看起来像这样

{
"SunRise" : "5.30:00",
"SunSet" : "6:30:00",
"MoonRise":"19:54:11",
"MoonSet":"7:50:55"
}

我的模型是这样的。

class AutoGenerate {
  AutoGenerate({
    required this.SunRise,
    required this.SunSet,
    required this.MoonRise,
    required this.MoonSet,
  });
  late final String SunRise;
  late final String SunSet;
  late final String MoonRise;
  late final String MoonSet;
  
  AutoGenerate.fromJson(Map<String, dynamic> json){
    SunRise = json['SunRise'];
    SunSet = json['SunSet'];
    MoonRise = json['MoonRise'];
    MoonSet = json['MoonSet'];
  }

  Map<String, dynamic> toJson() {
    final _data = <String, dynamic>{};
    _data['SunRise'] = SunRise;
    _data['SunSet'] = SunSet;
    _data['MoonRise'] = MoonRise;
    _data['MoonSet'] = MoonSet;
    return _data;
  }
}

MyFetch 机制。

Future<AutoGenerate> getData() async {
 
 final response =
    await http.get(Uri.parse('MyURL'));
    var data = json.decode(response.body);
}

我想为sun/moonrise/set制作一套卡片。下面的机制显示了我的小部件是如何发送到卡的。

@override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Container(
        alignment: Alignment.center,
        child: SafeArea(
          child: SingleChildScrollView(
          child: FutureBuilder<AutoGenerate>(
              future : getData(),
              builder: ( context,  AsyncSnapshot<AutoGenerate> snapshot) 
              {
               if (snapshot!.hasData) {
               return Container(
               child :    Card(
//                 margin: EdgeInsets.all(16.0),
                                    elevation: 1.2,
                                    color: Colors.yellowAccent[100],
                                    child: Padding(
                                      padding: EdgeInsets.all(16.0),
                                      child: Text('Sun Rise :'+snapshot.data.SunRise),
                                    ),
                                  )
                                  )
                                  }
                                  }
                                  )
                                  )
                                  )
                                  )
                                  }
                              

我在 snapshot.data.SunRise 上收到一条错误消息,说 “The 属性 'SunRise' cannot be unconditionally访问是因为接收器可以 'null'. (文档)尝试使访问有条件(使用'?.')或向目标('!')添加空检查。

我尝试了所有选项,还尝试将响应分配给变量并使用该变量显示在卡片中,但又出现了另一个错误。

前进的最佳方式是什么?

谢谢

添加?.!,如果添加!,则应在点(.)

之后添加
 Container(
            alignment: Alignment.center,
            child: SafeArea(
                child: SingleChildScrollView(
                    child: FutureBuilder<AutoGenerate>(
                        future: getData(),
                        builder:
                            (context, AsyncSnapshot<AutoGenerate> snapshot) {
                          if (!snapshot.hasData) {
                            return Container(
                                child: Card(
//                 margin: EdgeInsets.all(16.0),
                              elevation: 1.2,
                              color: Colors.yellowAccent[100],
                              child: Padding(
                                padding: EdgeInsets.all(16.0),
                                child:
                                    Text("Sun Rise :  ${snapshot.data?.SunRise}")
                              ),
                            ));
                          } 
                        }))))

阅读更多关于 null safety