【问题标题】:Accessing StreamProvider anywhere in my flutter app在我的颤振应用程序中的任何地方访问 StreamProvider
【发布时间】:2021-07-29 19:28:33
【问题描述】:

我仍在学习 Flutter/Dart 并在此过程中创建应用程序。

现在,我正在查看我的代码,并认为我没有使用我在 main.dart 文件中创建的一些 StreamProviders 太辛苦了。我在旅程的一开始就这样做了,所以我真的不知道自己在做什么。我只是在学习一个教程。

因此,我在 main.dart 中创建了一个 multiprovider 和一些 StreamProviders。

Widget build(BuildContext context) {
    final firestoreService = FirestoreService();

    Provider.debugCheckInvalidValueType = null;
    
    return MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (context) => AgentProvider()),
        ChangeNotifierProvider(create: (context) => AgencyProvider()),
        ChangeNotifierProvider(create: (context) => TrxnProvider()),
        ChangeNotifierProvider(create: (context) => EventProvider()),
        // The following providers are for retrieving the data for editing purposes
        // The stream providers are only called once but they can be accessed
        // anywhere in the app.
        StreamProvider(create: (context) => firestoreService.getAgents(), initialData: []),
        StreamProvider(create: (context) => firestoreService.getAgency(), initialData: []),
        StreamProvider(
            create: (context) => firestoreService.getAgencyTrxns(context),  initialData: []),
      ],
      child: MaterialApp(
        debugShowCheckedModeBanner: false,
        home: LoginScreen(),
      ),
    );
  }

如您所见,我添加了注释说明我可以在代码中的任何位置访问流,但我一直在创建新的流。是的,这很尴尬,但我正在学习。

这是用于创建上述 StreamProviders 的 3 个函数

 Stream<List<Agents>> getAgents() {
    return _db.collection('agents').snapshots().map((snapshot) => snapshot.docs
        .map((document) => Agents.fromFirestore(document.data()))
        .toList());
  }

  Stream<List<Agency>> getAgency() {
    return _db.collection('agency').snapshots().map((snapshot) => snapshot.docs
        .map((document) => Agency.fromFirestore(document.data()))
        .toList());
  }

  Stream<QuerySnapshot> getAgencyTrxns(BuildContext context) async* {
    yield* FirebaseFirestore.instance
        .collection('agency').doc(globals.agencyId)
        .collection('trxns')
        .where('trxnStatus', isNotEqualTo: 'Closed')
        .snapshots();
  }

如果我意识到我所做的事情会为我节省很多工作......我想。

现在,我正在尝试学习如何在我的代码中使用这些 StreamProvider。如何在 StreamBuilder 中使用它们?目前,这就是我正在做的事情,我认为我没有使用我在 main.dart 中创建的 StreamProviders。

child: StreamBuilder(
                      stream: _db.collection('agency').snapshots(),
                      builder: (BuildContext context, AsyncSnapshot snapshot) {
                        if (snapshot.data == null) {
                          return Center(
                            child: CircularProgressIndicator(),
                          );
                        } else {

我想我需要使用消费。我正在观看 YouTube 视频,但不是很清楚。我真的很想使用我已经拥有的 StreamProviders,而不是创建新的流和使用内存。

您可以提供的任何帮助,或者您是否可以向我指出一个更好的教程。

【问题讨论】:

    标签: flutter stream


    【解决方案1】:

    我找到了我需要的答案。这是我在 Udemy.com 上最初的 Dart/flutter 课程。 The Complete 2021 Flutter Development Bootcamp with Dart

    这是一门很棒的课程,我需要经常回去学习。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-16
      • 2019-12-08
      • 2020-06-20
      • 2021-07-02
      • 1970-01-01
      • 2020-06-13
      • 1970-01-01
      相关资源
      最近更新 更多