【发布时间】:2021-07-21 08:20:22
【问题描述】:
我正在使用 StreamProvider,它由 Firestore Stream 赋予一个值。正如预期的那样,它最初开始产生空值。然后更新流以开始从有效的 Firestore 文档中生成值,并且流提供程序也按预期进行。
然后我有一个用户操作,它应该停止读取 Firestore 文档并为流/流提供者提供一个空值,并通知侦听器该流现在具有一个空值。它不这样做,而是继续流式传输最后一个已知的非空值。单步执行代码,我看到在用户操作中调用 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;
}
}```
【问题讨论】:
-
用户操作是什么?
notifyListeners()在哪里 -
用户操作是注销。注销功能有这个:
Provider.of<AppUser>(context, listen: false).setGameCode(null);这是来自 AppUser 模型:void setGameCode(String gameCode) async { code = gameCode; notifyListeners(); }