【问题标题】:The argument type 'Stream<MyUser?>' can't be assigned to the parameter type 'Stream<MyUser?>?'参数类型“Stream<MyUser?>”不能分配给参数类型“Stream<MyUser?>?”
【发布时间】:2021-12-07 16:30:35
【问题描述】:

我正在尝试在this playlist 的帮助下创建一个用户系统。但是,它有点过时了,所以我试图跟上今天的步伐。我完全是初学者。我从 stackoverflow 中阅读了few things,但我跟不上。这是它给出的错误:

The argument type 'Stream<MyUser?>' can't be assigned to the parameter type 'Stream<MyUser?>?'.

这是 main.dart:(具体的错误就在“value: AuthService().user”行中。“AuthService().user”部分是红色下划线。)

import 'package:flutter/material.dart';
import 'package:unistuff_main/screens/wrapper.dart';
import 'package:provider/provider.dart';
import 'package:unistuff_main/services/auth.dart';
import 'package:unistuff_main/models/myuser.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return StreamProvider<MyUser?>.value(
      initialData: null,
      value: AuthService().user,
      child: MaterialApp(
        home: Wrapper(),
      ),
    );
  }
}

这是我的 myuser.dart 文件:

class MyUser {
  final String? uid;

  MyUser({this.uid});
}

这里是 auth.dart:(如果你注意到我还没有添加任何登录方法。这会导致问题吗?)

import 'package:firebase_auth/firebase_auth.dart';
import 'package:unistuff_main/models/MyUser.dart';

class AuthService {
  final FirebaseAuth _auth = FirebaseAuth.instance; //private data member

  //create MyUser object based on FirebaseUser
  MyUser? _userfromFirebase(User user) {
    return user != null ? MyUser(uid: user.uid) : null;
  }

  //auth change user stream
  Stream<MyUser?> get user {
    return _auth
        .authStateChanges()
        .map((User? user) => _userfromFirebase(user!));
  }

  //sign in with email & password
  Future signInWithMail() async {
    try {} catch (e) {}
  }

  //register with email & password

  //sign out
}

感谢您的帮助..

【问题讨论】:

  • 你好,AuthService().user 返回什么?
  • 嗨,对不起。我在帖子中添加了 auth.dart 文件。

标签: firebase flutter dart firebase-authentication


【解决方案1】:

库 URI 区分大小写。 AuthService 从 MyUser.dart 导入 MyUser,而 MyApp 从 myuser.dart 导入 MyUser。即使它们是同一个文件(假设文件系统不区分大小写),它们也被视为不同的库,因此类型不匹配。

您需要更改其中一个导入语句以匹配另一个。

【讨论】:

  • 其他答案集中在可空类型和不可空类型之间的区别上,但在需要 Foo? 的地方提供 Foo 是完全有效的。
【解决方案2】:

您的AuthService().user 的类型似乎不能为空,因此请尝试将用户的类型从您的 auth.dart 更改为 Stream?。

Stream<MyUser?>? get onAuthStateChanges => FirebaseAuth.instance
  .authStateChanges()
  .map((currentUser) => MyUser.fromSnapshot(currentUser!));

我不确定,但您可能正在使用来自FirebaseAuth.instanceauthStateChanges()。因此,如果它不能解决您的问题,请打印 AuthService().user :)

【讨论】:

  • 我添加了 auth.dart 文件来发布,很抱歉忘记了。我添加了额外的“?” 附近的符号但它没有改变错误:(谢谢
【解决方案3】:

在发生错误的行中,尝试使用操作符??如果为 null,则传递原始对象。

例如:

MyObject(
  stringField: myString ?? '', //you are ensuring that if your String is null, there will be no error
);

【讨论】:

  • 我尝试添加“??”进入这条线,但它并没有改变任何东西。具体错误在“value: AuthService().user”行中。谢谢你的回复。
猜你喜欢
  • 1970-01-01
  • 2021-09-04
  • 2021-09-26
  • 2023-03-13
  • 1970-01-01
  • 2021-10-28
  • 2021-12-30
  • 2021-11-05
  • 2021-01-05
相关资源
最近更新 更多