Flutter Error : The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand
Flutter Error : The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand
我正在尝试构建我的 flutter 项目,但在使用三元运算符时出现错误。
我正在使用三元运算符,因为它会检查第一条语句是否为空,如果为空则它将使用第二条语句。这对我的代码有帮助,但出现错误,它指出:
左操作数不能为空,所以右操作数永远不会执行。尝试删除运算符和正确的操作数。
示例:
value: initial_value ?? current_value
代码:
class SettingsForm extends StatefulWidget {
@override
_SettingsFormState createState() => _SettingsFormState();
}
class _SettingsFormState extends State<SettingsForm> {
final _formKey = GlobalKey<FormState>();
final List<String> sugars = ['0', '1', '2', '3', '4'];
final List<int> strengths = [100, 200, 300, 400, 500, 600, 700, 800, 900];
// form values
late String _currentName;
late String _currentSugars;
late int _currentStrength;
@override
Widget build(BuildContext context) {
MyUser user = Provider.of<MyUser>(context);
return StreamBuilder<UserData>(
stream: DatabaseService(uid: user.uid).userData,
builder: (context, snapshot) {
if (snapshot.hasData) {
UserData? userData = snapshot.data;
return Form(
key: _formKey,
child: Column(
children: <Widget>[
Text(
'Update your brew settings.',
style: TextStyle(fontSize: 18.0),
),
SizedBox(height: 20.0),
TextFormField(
initialValue: userData!.name,
decoration: textInputDecoration,
validator: (val) =>
val!.isEmpty ? 'Please enter a name' : null,
onChanged: (val) => setState(() => _currentName = val),
),
SizedBox(height: 10.0),
DropdownButtonFormField(
value: _currentSugars ?? userData.sugars, <--Error : **userData.sugars**
decoration: textInputDecoration,
items: sugars.map((sugar) {
return DropdownMenuItem(
value: sugar,
child: Text('$sugar sugars'),
);
}).toList(),
onChanged: (val) => setState(() => _currentSugars = val),
),
SizedBox(height: 10.0),
Slider(
value: (_currentStrength ?? userData.strength).toDouble(), <--Error : **userData.strength**
activeColor:
Colors.brown[_currentStrength ?? userData.strength], <--Error : **userData.strength**
inactiveColor:
Colors.brown[_currentStrength ?? userData.strength], <--Error : **userData.strength**
min: 100.0,
max: 900.0,
divisions: 8,
onChanged: (val) =>
setState(() => _currentStrength = val.round()),
),
ElevatedButton(
style:
ElevatedButton.styleFrom(primary: Colors.pink[400]),
child: Text(
'Update',
style: TextStyle(color: Colors.white),
),
onPressed: () async {
if (_formKey.currentState!.validate()) {
await DatabaseService(uid: user.uid).updateUserData(
_currentSugars ?? snapshot.data!.sugars, <--Error : **snapshot.data!.sugars**
_currentName ?? snapshot.data!.name, <--Error : **snapshot.data!.name**
_currentStrength ?? snapshot.data!.strength); <--Error : **snapshot.data!.strength**
Navigator.pop(context);
}
}),
],
),
);
} else {
return Loading();
}
});
}
}
'MyUser' 数据 class :
class UserData {
final String uid;
final String name;
final String sugars;
final int strength;
UserData({ required this.uid, required this.sugars, required this.strength, required this.name });
Screenshot Update
您已将 _currentSugars
变量声明为不可为 null 的字符串。因此,您明确声明它不能包含空值。通过向其添加 late 关键字,编译器无法在编译时确保空安全约束。
The late modifier means “enforce this variable’s constraints at
runtime instead of at compile time”
所以不要将其声明为:
late String _currentSugars;
声明为:
String? _currentSugars;
我正在尝试构建我的 flutter 项目,但在使用三元运算符时出现错误。 我正在使用三元运算符,因为它会检查第一条语句是否为空,如果为空则它将使用第二条语句。这对我的代码有帮助,但出现错误,它指出:
左操作数不能为空,所以右操作数永远不会执行。尝试删除运算符和正确的操作数。
示例:
value: initial_value ?? current_value
代码:
class SettingsForm extends StatefulWidget {
@override
_SettingsFormState createState() => _SettingsFormState();
}
class _SettingsFormState extends State<SettingsForm> {
final _formKey = GlobalKey<FormState>();
final List<String> sugars = ['0', '1', '2', '3', '4'];
final List<int> strengths = [100, 200, 300, 400, 500, 600, 700, 800, 900];
// form values
late String _currentName;
late String _currentSugars;
late int _currentStrength;
@override
Widget build(BuildContext context) {
MyUser user = Provider.of<MyUser>(context);
return StreamBuilder<UserData>(
stream: DatabaseService(uid: user.uid).userData,
builder: (context, snapshot) {
if (snapshot.hasData) {
UserData? userData = snapshot.data;
return Form(
key: _formKey,
child: Column(
children: <Widget>[
Text(
'Update your brew settings.',
style: TextStyle(fontSize: 18.0),
),
SizedBox(height: 20.0),
TextFormField(
initialValue: userData!.name,
decoration: textInputDecoration,
validator: (val) =>
val!.isEmpty ? 'Please enter a name' : null,
onChanged: (val) => setState(() => _currentName = val),
),
SizedBox(height: 10.0),
DropdownButtonFormField(
value: _currentSugars ?? userData.sugars, <--Error : **userData.sugars**
decoration: textInputDecoration,
items: sugars.map((sugar) {
return DropdownMenuItem(
value: sugar,
child: Text('$sugar sugars'),
);
}).toList(),
onChanged: (val) => setState(() => _currentSugars = val),
),
SizedBox(height: 10.0),
Slider(
value: (_currentStrength ?? userData.strength).toDouble(), <--Error : **userData.strength**
activeColor:
Colors.brown[_currentStrength ?? userData.strength], <--Error : **userData.strength**
inactiveColor:
Colors.brown[_currentStrength ?? userData.strength], <--Error : **userData.strength**
min: 100.0,
max: 900.0,
divisions: 8,
onChanged: (val) =>
setState(() => _currentStrength = val.round()),
),
ElevatedButton(
style:
ElevatedButton.styleFrom(primary: Colors.pink[400]),
child: Text(
'Update',
style: TextStyle(color: Colors.white),
),
onPressed: () async {
if (_formKey.currentState!.validate()) {
await DatabaseService(uid: user.uid).updateUserData(
_currentSugars ?? snapshot.data!.sugars, <--Error : **snapshot.data!.sugars**
_currentName ?? snapshot.data!.name, <--Error : **snapshot.data!.name**
_currentStrength ?? snapshot.data!.strength); <--Error : **snapshot.data!.strength**
Navigator.pop(context);
}
}),
],
),
);
} else {
return Loading();
}
});
}
}
'MyUser' 数据 class :
class UserData {
final String uid;
final String name;
final String sugars;
final int strength;
UserData({ required this.uid, required this.sugars, required this.strength, required this.name });
Screenshot Update
您已将 _currentSugars
变量声明为不可为 null 的字符串。因此,您明确声明它不能包含空值。通过向其添加 late 关键字,编译器无法在编译时确保空安全约束。
The late modifier means “enforce this variable’s constraints at runtime instead of at compile time”
所以不要将其声明为:
late String _currentSugars;
声明为:
String? _currentSugars;