Flutter:无法让 StreamProvider 故意产生空值

Flutter: Can't get StreamProvider to intentionally produce a null value

我正在使用 StreamProvider,它由 Firestore Stream 赋予一个值。正如预期的那样,它最初开始生成 null。然后更新流以开始从有效的 Firestore 文档生成值,并且流提供程序也会按预期进行。

然后我有一个用户操作,然后应该停止读取 Firestore 文档并为 stream/streamprovider 提供空值并通知侦听器流现在具有空值。它不会这样做,而是继续流式传输最后已知的非空值。单步执行代码,我看到 databaseService.gameStream 是在用户操作时使用 null 输入调用的,正如预期的那样,但是 StreamProvider 的输出并没有像代码指定的那样更改为 null。

有人能看到我遗漏了什么吗?

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [ChangeNotifierProvider(create: (context) => AppUser())],
      child: InnerProviderClass(),
    );
  }
}

class InnerProviderClass extends StatelessWidget {
  final databaseService = DatabaseService();
  @override
  Widget build(BuildContext context) {
    AppUser appUser = Provider.of<AppUser>(context);
    return MultiProvider(
      providers: [
        StreamProvider<Game>.value(
          value: databaseService.gameStream(appUser.getCode),
          initialData: null,
          catchError: (_, err) {
            print(err);
            return null;
          },
        ),
      ],
      child: MaterialApp(
        navigatorKey: navigatorKey,
        title: 'Game',
        home: RouterNavigator(),
      ),
    );
  }
}

class DatabaseService {
  Stream<Game> gameStream(String gameCode) {
    return (gameCode != null)
        ? FirebaseFirestore.instance
            .collection('games')
            .doc(gameCode)
            .snapshots()
            .map((doc) => Game.fromDocument(doc))
        : null;
  }
}```

通过将上述代码中的段更改为以下内容,我能够使其正常工作:

class DatabaseService {
  Stream<Game> gameStream(String gameCode) {
    return (gameCode != null)
        ? FirebaseFirestore.instance
            .collection('games')
            .doc(gameCode)
            .snapshots()
            .map((doc) => Game.fromDocument(doc))
        : Stream<Game>.value(null);
   }
}

Stream<Game>.value(null); 行已更改。