首页 > 解决方案 > Flutter Cloud Firestore StreamBuilder错误

问题描述

更新我的颤振插件后,我不得不更新我的代码,因为我收到了像这样的错误“Firestore”已被弃用,不应该被使用。类 Firestore 已弃用,请改用“FirebaseFirestore”。

我遵循警告并更新了我的代码,但现在我的 streamBuilders 无法正常工作,我不知道为什么。

这是我的代码

class PickupLayout extends StatelessWidget {


final Widget scaffold;
  final CallMethods callMethods = CallMethods();

  PickupLayout({
    @required this.scaffold,
  });

  @override
  Widget build(BuildContext context) {
    final UserProvider userProvider = Provider.of<UserProvider>(context);

return (userProvider != null && userProvider.getUser != null)
    ? StreamBuilder<DocumentSnapshot>(
        stream: callMethods.callStream(uid: userProvider.getUser.uid),
        builder: (context, snapshot) {
          if (snapshot.hasData && snapshot.data.data != null) {
            Call call = Call.fromMap(snapshot.data.data());

            if (!call.hasDialled) {
              return PickupScreen(call: call);
            }
          }
          return scaffold;
        },
      )
    : Scaffold(
        body: Center(
          child: CircularProgressIndicator(),
        ),
      );
  }
}

这是错误

════════ Exception caught by widgets library ═══════════════════════════════════
The following NoSuchMethodError was thrown building StreamBuilder<DocumentSnapshot>(dirty, state: _StreamBuilderBaseState<DocumentSnapshot, AsyncSnapshot<DocumentSnapshot>>#a2802):
The method '[]' was called on null.
Receiver: null
Tried calling: []("caller_id")
The relevant error-causing widget was
StreamBuilder<DocumentSnapshot>
package:vdb_tinus_app/…/pickup/pickup_layout.dart:22
When the exception was thrown, this was the stack
#0      Object.noSuchMethod (dart:core-patch/object_patch.dart:51:5)
#1      new Call.fromMap
package:vdb_tinus_app/…/models/call.dart:37
#2      PickupLayout.build.<anonymous closure>
package:vdb_tinus_app/…/pickup/pickup_layout.dart:26
#3      StreamBuilder.build
package:flutter/…/widgets/async.dart:525
#4      _StreamBuilderBaseState.build

根据日志,在更新我的云 Firestore 之前插入的错误行在更新 if (snapshot.hasData && snapshot.data.data != null) { Call call = Call.fromMap(snapshot.data.data);后看起来像这样,我不得不将其更改为 if (snapshot.hasData && snapshot.data.data != null) { Call call = Call.fromMap(snapshot.data.data());

标签: flutterdartgoogle-cloud-firestore

解决方案


在这一行中if (snapshot.hasData && snapshot.data.data != null) {,您正在检查是否DocumentSnapshot.data为空。由于它是一个函数(因此是一个对象),因此您的比较永远不会评估为false.

在下一行,snapshot.data.data()你正在调用上面的函数,它的返回值很可能是null


推荐阅读