【问题标题】:Flutter/Firebase - Merge 2 streams and utilise result in PageView BuilderFlutter/Firebase - 合并 2 个流并在 PageView Builder 中利用结果
【发布时间】:2020-09-01 13:54:04
【问题描述】:

我正在尝试从 firebase 获取两个数据流并将它们合并为一个,然后在我的 Flutter 应用程序的 PageView 构建器中使用。我已经设法让我的第一个流工作(默认情况),但我现在需要添加另一个。这是两个流:

    Stream<QuerySnapshot> getDefaultOccasions(BuildContext context) async*{
  yield* Firestore.instance.collection('datestoremember').document('default').collection('Dates_to_Remember').snapshots();
}

Stream<QuerySnapshot> getPersonalOccasions(BuildContext context) async*{
  final uid = await Provider.of(context).auth.getCurrentUID();
  yield* Firestore.instance.collection('datestoremember').document(uid).collection('Dates_to_Remember').snapshots();
}

我不确定将两个流合并在一起然后在页面视图构建器中使用结果的最佳方法:

child: StreamBuilder(
            stream: getDefaultOccasions(context),
            builder: (context, snapshot) {
              if(!snapshot.hasData) return const Text("Loading...");
              return new PageView.builder(
              itemCount: snapshot.data.documents.length,
              controller: PageController(viewportFraction: 0.5),
              onPageChanged: (int index) => setState(() => _index = index),
              itemBuilder: (_, i) {
                return Transform.scale(
                  scale: i == _index ? 1 : 0.5,
                  child: Card(
                    elevation: 6,
                    shape: RoundedRectangleBorder(
                        borderRadius: BorderRadius.circular(10)),
                    child: Column(
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: [
                        Text(snapshot.data.documents[i]['Date'].toDate().day.toString()),
                        Text(DateFormat.MMMM()
                            .format(
                            formatter.parse(snapshot.data.documents[i]['Date'].toDate().toString()))
                            .toString()),
                        Padding(
                          padding: const EdgeInsets.only(
                              left: 8.0, right: 8.0),
                          child: FittedBox(
                            fit: BoxFit.contain,
                            child: Text(
                              snapshot.data.documents[i]['Title'],
                              overflow: TextOverflow.ellipsis,
                            ),
                          ),
                        )
                      ],
                    ),
                  ),
                );
              },
            );},
          ),

所有代码如下:

class AccountPage extends StatefulWidget {
  @override
  _AccountPageState createState() => _AccountPageState();
}

class _AccountPageState extends State<AccountPage> {
  List<Category> _categories = [
    Category('My History', Icons.history, MyHistory()),
    Category('Dates to Remember', Icons.event_note, DatesToRemember()),
    Category('Terms and Conditions', Icons.assignment, TermsandConditions()),
    Category('Privacy Notice', Icons.security, PrivacyNotice()),
    Category('Rate us', Icons.stars, RateUs()),
    Category('Send us Feedback', Icons.feedback, GiveUsFeedback())
  ];

  DateFormat formatter = DateFormat('dd-MM-yyyy');

  int _index = 0;

  @override
  Widget build(BuildContext context) {
    return SingleChildScrollView(
      scrollDirection: Axis.vertical,
      child: Column(
        children: [
          Container(
            child: SizedBox(
              height: 75, // card height
              child: StreamBuilder(
                stream: getDefaultOccasions(context),
                builder: (context, snapshot) {
                  if(!snapshot.hasData) return const Text("Loading...");
                  return new PageView.builder(
                  itemCount: snapshot.data.documents.length,
                  controller: PageController(viewportFraction: 0.5),
                  onPageChanged: (int index) => setState(() => _index = index),
                  itemBuilder: (_, i) {
                    return Transform.scale(
                      scale: i == _index ? 1 : 0.5,
                      child: Card(
                        elevation: 6,
                        shape: RoundedRectangleBorder(
                            borderRadius: BorderRadius.circular(10)),
                        child: Column(
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: [
                            Text(snapshot.data.documents[i]['Date'].toDate().day.toString()),
                            Text(DateFormat.MMMM()
                                .format(
                                formatter.parse(snapshot.data.documents[i]['Date'].toDate().toString()))
                                .toString()),
                            Padding(
                              padding: const EdgeInsets.only(
                                  left: 8.0, right: 8.0),
                              child: FittedBox(
                                fit: BoxFit.contain,
                                child: Text(
                                  snapshot.data.documents[i]['Title'],
                                  overflow: TextOverflow.ellipsis,
                                ),
                              ),
                            )
                          ],
                        ),
                      ),
                    );
                  },
                );},
              ),
            ),
          ),
//          SizedBox(height: 100.0,),
          Container(
            // Page Options
            height: MediaQuery
                .of(context)
                .size
                .height * 0.7,
            child: ListView.builder(
                itemCount: _categories.length,
                itemBuilder: (context, index) {
                  return Column(
                    children: <Widget>[
                      ListTile(
                        leading: Icon(
                          _categories[index].icon,
                          color: Colors.black,
                        ),
                        title: Text(_categories[index].name),
                        trailing: Icon(Icons.arrow_forward_ios),
                        onTap: () =>
                            Navigator.push(
                                context,
                                MaterialPageRoute(
                                    builder: (context) =>
                                    _categories[index].route)),
                      ),
                      Divider(), //                           <-- Divider
                    ],
                  );
                }),
          ),
        ],
      ),
    );
  }

}

Stream<QuerySnapshot> getDefaultOccasions(BuildContext context) async*{
  yield* Firestore.instance.collection('datestoremember').document('default').collection('Dates_to_Remember').snapshots();
}

Stream<QuerySnapshot> getPersonalOccasions(BuildContext context) async*{
  final uid = await Provider.of(context).auth.getCurrentUID();
  yield* Firestore.instance.collection('datestoremember').document(uid).collection('Dates_to_Remember').snapshots();
}

【问题讨论】:

    标签: firebase flutter stream


    【解决方案1】:

    您可以像这样合并两个流:

    StreamGroup.merge([getDefaultOccasions(context), getPersonalOccasions(context)]).asBroadcastStream();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 2020-10-01
      • 2017-04-29
      • 2017-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多