【问题标题】:Ternary Operator dart flutter null. type 'Null' is not a 'bool' in boolean expression三元运算符 dart flutter null。类型'Null'不是布尔表达式中的'bool'
【发布时间】:2021-09-09 00:53:57
【问题描述】:

我的代码有问题,谁能帮帮我。

世界时间.dart

import 'package:http/http.dart';
import 'dart:convert';
import 'package:intl/intl.dart';

class WorldTime {
  String? time;
  String? url;
  String? location;
  String? flag;
  late bool isDaytime;

  WorldTime({this.url, this.location, this.flag});

  Future<void> getTime() async {
    try {
      // make the request
      Response response = await get(Uri.parse('http://worldtimeapi.org/api/timezone/$url'));
      Map data = jsonDecode(response.body);

      // get properties from data
      String datetime = data['datetime'];
      String offset = data['utc_offset'].substring(1,3);
  
      // create datetime object
      DateTime now = DateTime.parse(datetime);
      now = now.add(Duration(hours: int.parse(offset))); 
  
      // set the time property
      isDaytime = now.hour > 6 && now.hour < 20 ? true : false;
      time = DateFormat.jm().format(now);

    } catch (e) {
      print('caught error: $e');
      time = 'Cant get datetime';
    }
  }
}

loading.dart

import 'package:flutter/material.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart';
import 'package:test_worldtime/service/world_time.dart';

class LoadingScreen extends StatefulWidget {
  @override
  _LoadingScreenState createState() => _LoadingScreenState();
}

class _LoadingScreenState extends State<LoadingScreen> {

  void setWorldTime() async {
    WorldTime instance = WorldTime(url: 'Asia/Jakarta', location: 'Jakarta', flag: 'indonesia.jpg');
    await instance.getTime();
    Navigator.pushReplacementNamed(context, '/home', arguments: {
      'location': instance.location,
      'time': instance.time,
      'flag': instance.flag,
      'isDaytime': instance.isDaytime
    });
  }
  @override
  void initState() {
    super.initState();
    setWorldTime();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.blue[900],
      body: Center(
        child: SpinKitCircle(
          color: Colors.white,
          size: 80.0,
        )
      ),
    );
  }
}

home.dart

import 'package:flutter/material.dart';
import 'package:legacy_buttons/legacy_buttons.dart';

class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  Map data = {};
  
  @override
  Widget build(BuildContext context) {
    data = ModalRoute.of(context)!.settings.arguments as Map;
    print(data);

    // set background
    String bgImage = data['IsDayTime'] ? 'day.png' : 'night.png';

    return Scaffold(
      body: SafeArea(
        child: Container(
          decoration: BoxDecoration(
            image: DecorationImage(
              image: AssetImage('assets/day.png'),
              fit: BoxFit.cover
            )
          ),
        )
      )
    )
  }
}

我的问题是当我开始运行颤振时抛出一些错误它说:“类型'Null'不是布尔表达式中的'bool'”。我尝试将latebool? 放入isDaytime 仍然不起作用,有人可以帮帮我

编辑:如果我取消注释 String bgImage 并将 AssetImage('assets/day.png') 更改为 AssetImage('assets/$bgImage'),此代码将出错

此链接视频:https://www.youtube.com/watch?v=NDulhXVcLuI&list=PL4cUxeGkcC9jLYyp2Aoh6hcWuxFDX6PBJ&index=33

【问题讨论】:

  • 如果不是将其标记为迟到,而是将其标记为可为空怎么办?比如:布尔?是白天
  • 我尝试输入 bool? 仍然不适合我
  • 您确定错误来自该行吗?您的三元条件中没有任何内容可能导致它为空。而且,那个三元表达式是没有用的。只需isDaytime = now.hour &gt; 6 &amp;&amp; now.hour &lt; 20;
  • 你的日期时间是否为空?
  • data['IsDayTime'] 如果未找到密钥,将返回 null。您需要为这种情况提供一个备用值。例如:(data['IsDayTime'] ?? true) ? 'day.png' : 'night.png'

标签: flutter dart


【解决方案1】:

问题是“类型'Null'不是布尔表达式中的'bool'”。

这是因为:

String bgImage = data['IsDayTime'] ? 'day.png' : 'night.png';

如果键 IsDayTime 不在数据中,则返回 null。

您可以使用 Map 的 .containsKey 方法获得所需的结果并返回布尔值:

String bgImage = data.containsKey('IsDayTime') ? 'day.png' : 'night.png';

您可以将三元逻辑分解为 if 语句以更好地理解它:

if (data.containsKey('IsDayTime')){
  bgImage = 'day.png';
} else {
  bgImage = 'night.png';
}

如果你想这样做但保持你已经拥有的相同的单行格式,你可以创建一个函数并将它的结果分配给变量:

String isDayTime(Map data){
if (data.containsKey('IsDayTime')){
  return 'day.png';
} else {
  return 'night.png';
}
}

String bgImage = isDayTime(data);



【讨论】:

    【解决方案2】:

    我的坏人,这段代码中的所有错误只是因为我写错了: String bgImage = data['IsDayTime'] ? 'day.png' : 'night.png';

    我应该写: data['isDaytime'] 因为在 WorldTime 课上我输入了late bool isDaytime;, 我打错了大写和小写字母,这就是为什么flutter会抛出null。

    【讨论】:

      猜你喜欢
      • 2020-11-25
      • 1970-01-01
      • 1970-01-01
      • 2022-08-02
      • 2012-10-01
      • 2012-11-21
      • 2017-01-18
      • 2021-12-18
      相关资源
      最近更新 更多