【发布时间】: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