#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.