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
我有一个简单的 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