【问题标题】:Json parsing in flutter after null safety空安全后Json解析颤动
【发布时间】:2021-11-16 19:14:02
【问题描述】:

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

我想为太阳/月亮升起/设置一组卡片。下面显示我的小部件如何发送到卡的机制。

@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 上收到错误消息,提示 “无法无条件访问属性 'SunRise',因为接收者可以为 'null'。(文档)尝试使访问有条件(使用'?.')或向目标添加空检查('!')。

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

前进的最佳方式是什么?

谢谢

【问题讨论】:

    标签: json flutter dart dart-null-safety


    【解决方案1】:

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

     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

    【讨论】:

    • 然后出现一个新错误。参数类型“字符串?”不能分配给参数类型“字符串”。
    • 添加?毕竟字符串
    • 我也这样做了。错误不会消失。错误说。在模型后期最终字符串中更改为这个?日出;但仍然是同样的错误。错误不会改变。
    • 您在代码中使用 null 安全吗?您在哪里出现错误、UI 或屏幕?
    • 我很确定这是 null 安全的。不知道我还需要什么才能使这个更安全。这些错误只能在 IDE 中看到。尝试开发 Flutter 应用时使用 Android Studio IDE。
    猜你喜欢
    • 2019-08-31
    • 1970-01-01
    • 2021-11-13
    • 2019-11-08
    • 2020-01-25
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多