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);
行已更改。
我正在使用 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);
行已更改。