'Object?' 类型的值不能分配给 'Tasker?' 类型的变量

A value of type 'Object?' can't be assigned to a variable of type 'Tasker?'

最近将一个现有的和正在运行的 flutter 项目更新为空安全,但我无法使用 firebase 使我的登录逻辑正常工作。它因以下错误而失败

无法将 'Object?' 类型的值赋给 'Tasker?' 类型的变量。 尝试更改变量的类型,或将右侧类型强制转换为 'Tasker?'.

Widget _getScreenId() {
    print('screen id');
    return StreamBuilder<User?>(
      stream: FirebaseAuth.instance.authStateChanges(),
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          Provider.of<UserData>(context, listen: false).currentUserId =
              snapshot.data!.uid;
          return FutureBuilder(
              future: DatabaseService.getUserWithId(snapshot.data!.uid),
              builder: (context, snapshot) {
                if (snapshot.hasData) {
                  print(snapshot.data);
                  Tasker? user = snapshot.data;
                  print("home");
                  return HomeScreen(user: user, currentUserId: '',);
                }
                return const SizedBox.shrink();
              });
        } else {
          return const LoginScreen();
        }
      },
    );
  }

你的快照默认returns一个对象类型尝试快照到AsyncSnapshot快照

Widget _getScreenId() {
    print('screen id');
    return StreamBuilder<User?>(
      stream: FirebaseAuth.instance.authStateChanges(),
      builder: (context,AsyncSnapshot<Tasker> snapshot) {
        if (snapshot.hasData) {
          Provider.of<UserData>(context, listen: false).currentUserId =
              snapshot.data!.uid;
          return FutureBuilder(
              future: DatabaseService.getUserWithId(snapshot.data!.uid),
              builder: (context, snapshot) {
                if (snapshot.hasData) {
                  print(snapshot.data);
                  Tasker? user = snapshot.data;
                  print("home");
                  return HomeScreen(user: user, currentUserId: '',);
                }
                return const SizedBox.shrink();
              });
        } else {
          return const LoginScreen();
        }
      },
    );
  }

最终得到了这个似乎有效的方法

 Widget _getScreenId() {
    // print('screen id');
    return StreamBuilder<User>(
      stream: FirebaseAuth.instance.authStateChanges(),
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          Provider.of<UserData>(context, listen: false).currentUserId =
              snapshot.data.uid;
          return FutureBuilder(
              future: DatabaseService.getUserWithId(snapshot.data.uid),
              builder: (context, snapshot) {
                if (snapshot.hasData) {
                  Tasker user = snapshot.data;
                  // print("home");
                  return HomeScreen(currentUserId: user.id, user: user);
                }
                return const SizedBox.shrink();
              });
        } else {
          return const LoginScreen();
        }
      },
    );
  }