Как исправить тип «Null» не является «bool» в логическом выражении

#flutter

Вопрос:

Я попробовал этот код, но тенарный оператор работает не так, как должен, так как я получаю ошибку, и если поместить строку bgImage = (данные[‘isDayTime’]==null)? ‘day.png’ : ‘night.png’; тогда я получаю только day.png, я получаю эту ошибку

Следующий TypeErrorImpl был сброшен при построении Home(грязный, зависимости: [_ModalScopeStatus], состояние: _HomeState#1a387): тип «Null» не является «bool» в логическом выражении

Вот код

 import 'package:flutter/material.dart';

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

class _HomeState extends State<Home> {

  Map data = {};

  @override
  Widget build(BuildContext context) {

    data=data.isNotEmpty ? data : ModalRoute.of(context)?.settings?.arguments as Map;
    print(data);

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

    return Scaffold(
      body: SafeArea(
          child: Container(
            decoration: BoxDecoration(
              image: DecorationImage(
                image: AssetImage('assets/$bgImage'),
                fit: BoxFit.cover,
              )
            ),
            child: Padding(
              padding: const EdgeInsets.fromLTRB(0,120.0,0,0),
              child: Column(
                  children: <Widget>[
                    FlatButton.icon(
                      onPressed: () async {
                       dynamic result = await Navigator.pushNamed(context, '/location');
                       setState(() {
                         data ={
                           'time': result['time'],
                           'location': result['location'],
                           'isDaytime': result['isDaytime'],
                           'flag': result['flag'],
                         };
                       });
              },
                      icon: Icon(
                          Icons.edit_location,
                          color: Colors.grey[300],
                      ),
                      label: Text(
                          'Edit Location',
                          style: TextStyle(
                            color: Colors.grey[300],

                      ),
                      ),
                    ),

                  SizedBox(height: 20.0),
                    Row(
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: <Widget>[
                        Text(
                         data['location'],
                         style: TextStyle(
                           fontSize: 28.0,
                           letterSpacing: 2.0
                         )
                        )
                      ],
                    ),
                    SizedBox(height: 20.0),
                    Text(
                      data['time'],
                      style: TextStyle(
                        fontSize: 66.0,
                      ),
                    ),
                  ],
              ),
            ),
          ),
      ),
    );
  }
}
 

Комментарии:

1. можете ли вы включить argument то, что вы проходите?

2. бул? Сегодня время;

3. Вы уверены, что данные никогда не будут пустыми?

4. Например, если он пуст, вы устанавливаете его с помощью аргумента, поступающего с предыдущего экрана

Ответ №1:

Измените свое состояние с data['isDayTime']? на data['isDayTime']!=null amp;amp; data['isDayTime']==true? .

Комментарии:

1. Да, возможно, явное добавление == true должно сработать

2. Проверка обоих data['isDayTime'] != null и data['isDayTime'] == true не нужна, так как второе условие уже подразумевает первое. Это может быть справедливо data['isDayTime'] == true . Однако сравнения с true или false обычно являются запахом кода; намерение было бы более ясным, как data['isDayTime'] ?? false .

Ответ №2:

Основная проблема заключается в том, что вы передаете bool? isDaytime , и это обнуляемое значение означает, что оно может быть нулевым. Но использование String bgImage = data['isDayTime']? 'day.png' : 'night.png'; здесь средств data['isDayTime'] будет либо истинным, либо ложным. Вот почему вам нужно убедиться, что вы не получаете нулевое значение. Кроме того, другое нулевое значение может возникать из аргументов модального маршрута.

1-й раз проверьте, является ли data['isDayTime'] значение null или нет, а затем проверьте его. Вы можете следить за ответом @Monik.