【问题标题】:Flutter: Can't get StreamProvider to intentionally produce a null valueFlutter:无法让 StreamProvider 故意产生空值
【发布时间】: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&lt;AppUser&gt;(context, listen: false).setGameCode(null); 这是来自 AppUser 模型:void setGameCode(String gameCode) async { code = gameCode; notifyListeners(); }

标签: flutter flutter-provider


【解决方案1】:

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

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&lt;Game&gt;.value(null); 换行了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 2020-12-06
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多