【问题标题】:Flutter Error: Null check operator used on a null value in a StreamBuilderFlutter 错误:对 StreamBuilder 中的空值使用空检查运算符
【发布时间】:2022-01-10 17:22:58
【问题描述】:

Flutter 错误:对 StreamBuilder 中的空值使用空检查运算符

无论我做什么,我都会不断收到此错误,而不是我想要的用户数据, 在 database.dart 我没有放任何!或者 ?所以我猜这个问题出在这个文件上,但我不知道如何解决它。 我也尝试了我在谷歌上找到的所有命令,但它们都不起作用


class SettingsForm extends StatefulWidget {
  const SettingsForm({Key? key}) : super(key: key);

  @override
  _SettingsFormState createState() => _SettingsFormState();
}

class _SettingsFormState extends State<SettingsForm> {

  final _formKey = GlobalKey<FormState>();
  final List<String> sugars = ['0','1','2','3','4'];

  String?_currentName ;
  String?_currentSugars ;
  dynamic _currentStrength =1;

  @override
  Widget build(BuildContext context) {


    final user = Provider.of<myUser?>(context);


    return StreamBuilder<myUserData?>(
      stream: DatabaseService(uid: user!.uid).userData,

      builder: (context, snapshot) {
        if(snapshot.hasData) {
          myUserData? usdata = snapshot.data;
          return Form(
            key:_formKey,
            child: Column(
              children: [
                Text('Update your brew settings.',
                  style: TextStyle(fontSize:18.0),),
                SizedBox(height: 20,),
                TextFormField(
                  initialValue: usdata?.name,
                  decoration: textInputDecoration.copyWith(hintText: ' name'),
                  validator: (val) => val!.isEmpty ? 'Please enter a name' : null,
                  onChanged: (val) {
                    setState(() => _currentName = val);
                  },
                ),
                SizedBox(height: 20.0,),
                //dropdown
                DropdownButtonFormField<String>(
                  value: usdata?.sugars,


                  items: sugars.map((sugar){
                    return DropdownMenuItem(
                        value: sugar,
                        child: Text(' $sugar sugars')
                    );
                  }).toList(),
                  onChanged: (val) => setState(() => _currentSugars = val.toString()),
                ),
                SizedBox(height:20 ),
                //slider
                Slider(
                  value: (_currentStrength ?? usdata?.strength).toDouble(),
                  activeColor: Colors.brown[_currentStrength ?? usdata?.strength],
                  inactiveColor: Colors.brown[_currentStrength ?? usdata?.strength],
                  min:100,
                  max:900,
                  divisions: 8,
                  onChanged: (val) => setState(() {
                    _currentStrength = val.round();
                  }),
                ),
                RaisedButton(
                    color:Colors.pink[400],
                    child: Text('Update',
                      style: TextStyle(color:Colors.white),),
                    onPressed: () async {
                      print(_currentName);
                      print(_currentSugars);
                      print(_currentStrength);
                    })

              ],

            ),
          );
        }
else {
          myUserData usdata = snapshot.data!;
          print(usdata.name);
          print(usdata.sugars);
          print(usdata.strength);
          return Container();
        }
      }
    );
  }
}

【问题讨论】:

    标签: firebase flutter dart


    【解决方案1】:

    这是您的代码的简化:

    builder: (context, snapshot) {
      if(snapshot.hasData) {
        ...
      } else {
        myUserData usdata = snapshot.data!;
        print(usdata.name);
        print(usdata.sugars);
        print(usdata.strength);
        return Container();
      }
    },
    

    else 语句中的代码只有在 snapshot.hasData 为 false 时才会运行,这意味着 snapshot.data 为空,当您尝试读取它时会出现错误。

    【讨论】:

    • 我该如何改变呢?因为数据库中有数据
    • 只需删除从myUserData usdata = snapshot.data!print(usdata.strength); 的所有内容。好吧,您可以删除它或将其移动到 if 语句的另一侧。请记住,else 上的代码仅在没有数据时才会执行,例如在您的数据库返回结果所需的时间,即使数据库确实有数据。
    • 好的,谢谢你,我找到了解决方案。
    猜你喜欢
    • 2021-11-10
    • 2022-07-04
    • 2021-08-04
    • 2021-08-11
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多