【问题标题】:Can not properly loop through the fetched firestore data in flutter and display it in Tabs无法正确循环通过颤振获取的 Firestore 数据并将其显示在选项卡中
【发布时间】:2022-01-03 14:19:29
【问题描述】:

我正在尝试使用StreamBuilder 循环访问获取的数据并将其推送到TabController

问题是在TabController 中我需要设置length 属性。在我的情况下,它将是 3,但理想情况下,它应该根据我的 collection 中的 documents 的数量动态计算。

然后在我的TapBar 中我有tabs 属性,它应该看起来像这样:

 final List<Widget> myTabs = [
    Tab(text: 'Tab 1'),
    Tab(text: 'Tab 2'),
    Tab(text: 'Tab 3'),
  ];

所以我试图在StreamBuilder 中生成myTabs 列表:

final List<Widget> finalTabs = [];
Timestamp eventTabControl = snapshot.data?.docs[index].data()['day'];
finalTabs.addAll([Tab(text: eventTabControl.toDate().toString())]);

但它不像我预期的那样工作。它只会为我生成 1 个标签,而不是 3 个。

预期结果是:

但是,当我尝试在控制台中打印 finalTabs 时,它会显示我所有的 3 个值。

我的整个代码是:

import 'package:book_club/config/palette.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';

class EventTabControl extends StatefulWidget {
  const EventTabControl({Key? key}) : super(key: key);

  @override
  State<EventTabControl> createState() => _EventTabControlState();
}

class _EventTabControlState extends State<EventTabControl>
    with SingleTickerProviderStateMixin {
  late TabController _tabController;

  @override
  void dispose() {
    _tabController.dispose();
    super.dispose();
  }

  @override
  void initState() {
    _tabController = TabController(length: 1, vsync: this);
    _tabController.addListener(_handleTabSelection);
    super.initState();
  }

  _handleTabSelection() {
    if (_tabController.indexIsChanging) {
      setState(() {});
    }
  }

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<QuerySnapshot>(
      stream: FirebaseFirestore.instance.collection("schedule").snapshots(),
      builder: (context, snapshot) {
        if (!snapshot.hasData) {
          return Center(
            child: CircularProgressIndicator(),
          );
        } else {
          return ListView.builder(
              shrinkWrap: true,
              physics: NeverScrollableScrollPhysics(),
              itemCount: snapshot.data?.docs.length,
              itemBuilder: (_, index) {
                final List<Widget> finalTabs = [];
                Timestamp eventTabControl =
                    snapshot.data?.docs[index].data()['day'];
                finalTabs
                    .addAll([Tab(text: eventTabControl.toDate().toString())]);
                return Container(
                  child: Container(
                   
                    child: TabBar(
                      controller: _tabController,
                      indicatorWeight: 2.5,
                      indicatorSize: TabBarIndicatorSize.tab,
                      labelColor: Palette.custGreen,
                      unselectedLabelColor: Palette.custBlue,
                      indicator: BoxDecoration(
                        border: Border(
                          bottom: BorderSide(
                            color: Palette.custGreen,
                            width: 2.0,
                          ),
                        ),
                      ),
                      tabs: finalTabs,
                    ),
                  ),
                );
              });
        }
      },
    );
  }
}

这只是 TabController 的一个逻辑。

【问题讨论】:

    标签: flutter google-cloud-firestore tabs tabcontrol stream-builder


    【解决方案1】:

    您正在使用不适合的 ListView Builder,因为它会根据您的条件单独渲染您的小部件 3 次,相反,您可以动态返回选项卡,

    你的其他部分:

     else {   final List<Widget> finalTabs = [];
                snapshot.data?.docs.forEach((document){
                Timestamp eventTabControl = document.data()['day'];
                   finalTabs.add(eventTabControl.toDate().toString());
                  }
              );
    
              return  Container(
                       
                        child: TabBar(
                          controller: _tabController,
                          indicatorWeight: 2.5,
                          indicatorSize: TabBarIndicatorSize.tab,
                          labelColor: Palette.custGreen,
                          unselectedLabelColor: Palette.custBlue,
                          indicator: BoxDecoration(
                            border: Border(
                              bottom: BorderSide(
                                color: Palette.custGreen,
                                width: 2.0,
                              ),
                            ),
                          ),
                          tabs: finalTabs.isEmpty
                          ? <Widget>[]
                          : finalTabs.map((dynamicContent) {
                              return new Text('your contentContent')),
                           );
                          }).toList(),
                        ),
                     
                    );
                  
            }
    

    【讨论】:

    • 感谢@Krish Bhanushali 的回答。但我在这里得到一个错误:snapshot.data?.docs[index] 和之前我从itemBuilder: (_, index) 得到index 一样。我怎样才能在你的代码版本中解决这个问题?
    • @AndriiPryimak 您现在可以查看吗?我已经编辑了我的答案。
    • 这个已经可以了,但是我怎样才能显示我从 firestore snapshot.data?.docs[index].data()['day'] 而不是 return new Text('your contentContent') 检索到的值?
    • 没关系@Krish Bhanushali )) 我在那里发现了我的问题。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 2021-05-05
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多