【问题标题】:Flutter Error : The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operandFlutter 错误:左操作数不能为空,因此永远不会执行右操作数。尝试删除运算符和正确的操作数
【发布时间】:2021-09-28 05:51:01
【问题描述】:

我正在尝试构建我的颤振项目,但在使用三元运算符时出现错误。 我正在使用三元运算符,因为它会检查第一个语句是否为空,如果它为空,那么它将使用第二个语句。这对我的代码有帮助,但我遇到了一个错误,它指出:

左操作数不能为空,所以右操作数永远不会被执行。尝试删除运算符和正确的操作数。

例子:

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();
          }
        });
  }
}

“我的用户”数据类:

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 });

ScreenshotUpdate

【问题讨论】:

  • 如何使用_currentSugars!=null? _currentSugars: userData.sugars
  • 您将_currentSugars 声明为不可为空。声明为String? _currentSugars;
  • @YeasinSheikh 是的,但它显示了与不必要的空比较相关的蓝线:“操作数不能为空,因此条件始终为真。删除条件。”
  • 它的;可以这样使用,但是会显示消息,因为您的 currentSugars 永远不会收到空值,您也可以删除条件语句。
  • @MidhunMP 它说:“条件必须具有'bool'的静态类型。尝试更改条件。”和同样的错误:“左操作数不能为空,因此永远不会执行右操作数。尝试删除运算符和右操作数。”

标签: android flutter mobile flutter-layout


【解决方案1】:

您已将_currentSugars 变量声明为不可为空的字符串。因此,您明确声明它不能包含空值。通过在其中添加late关键字,编译器无法确保编译时的空安全约束。

根据late-variables

late 修饰符的意思是“在 运行时而不是编译时”

所以不要将其声明为:

late String _currentSugars;

声明为:

String? _currentSugars;

【讨论】:

猜你喜欢
  • 2021-09-26
  • 2014-11-19
  • 1970-01-01
  • 2012-09-27
  • 2021-09-25
  • 2020-06-07
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多