Flutter 流:流生成器返回 Null 值

Posted

技术标签:

【中文标题】Flutter 流:流生成器返回 Null 值【英文标题】:Flutter stream: Stream builder returns Null value 【发布时间】:2021-12-29 03:12:48 【问题描述】:

我正在尝试通过流从 Firestore 获取数据,但它返回 null。

这是我的模型的代码。

class UserData 
  String? uid;
  String? name;
  String? sugar;
  int? strength;

  UserData(
      required this.uid,
      required this.name,
      required this.sugar,
      required this.strength);

这是我的流服务

//User data from snapshot
  UserData _userDataFromSnapShot(DocumentSnapshot snapshot) 
    return UserData(
        uid: uid,
        name: snapshot['name'],
        sugar: snapshot['sugar'],
        strength: snapshot['strength']);
  

  //Get user Doc stream
  Stream<UserData> get userData 
    return brewCollection.doc(uid).snapshots().map(_userDataFromSnapShot);
  

在这里,我想将我从 Firestore 获得的数据与 Stream Builder 结合使用。并尝试在文本表单字段中显示数据的名称属性,但在这里我得到了空值, 虽然最终用户 = Provider.of(context);它返回我在打印语句中检查的 Uid 但是错误总是说 StreamBuilder 导致错误

    class _FormSettingState extends State<FormSetting> 
  final _formKey = GlobalKey<FormState>();
  final List<String> sugars = ['0', '1', '2', '3', '4', '5'];

  String? _currentName;
  String? _currentSugar = "0";
  dynamic _currentStrength;

  @override
  Widget build(BuildContext context) 
    final user = Provider.of<MyUser?>(context);
    return StreamBuilder<UserData>(
        stream: DataBaseServices(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),
                TextFormField(
                  initialValue: userdata?.name,
                  decoration:
                      textInputDecoration.copyWith(hintText: 'Enter Name'),
                  onChanged: (val) => setState(() => _currentName = val),
                  validator: (val) =>
                      val!.isEmpty ? 'Please Enter value' : null,
                ), 


else 
               return Loading();
           

这是错误消息

【问题讨论】:

【参考方案1】:

我认为问题出在您的服务文件中 - “名称:名称:快照['名称'],”数据未分配

UserData _userDataFromSnapShot(DocumentSnapshot snapshot) 
    return UserData(
        uid: uid,
        name: snapshot['name'],
        sugar: snapshot['sugar'],
        strength: snapshot['strength']);
  

【讨论】:

我省略了代码,因为它输入错误,但问题仍然存在。 您是否在快照或其他变量(如快照['sugar'])中获取数据? 不,我没有进入变量,我在快照中获取数据,然后映射该快照 这意味着您的 Stream 函数没有返回任何值? brewCollection.doc(uid).snapshots().map(_userDataFromSnapShot) 这个函数是否返回一个用户模型? UserData _userDataFromSnapShot(DocumentSnapshot snapshot) return UserData( uid: uid, name: snapshot['name'], sugar: snapshot['sugar'],strength: snapshot['strength']); 这个返回模型

以上是关于Flutter 流:流生成器返回 Null 值的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:拉动刷新和流生成器

更新时删除图像数据的流生成器

选择查询生成器返回 null

Flutter Streambuilder 不断重建

调用 Navigator Pop 或 Push 时触发 Flutter Stream Builder

尽管流返回对象,但 Flutter StreamProvider 返回 null