我必须转到这个屏幕两次,才能在flutter中从fetchAndSet加载数据



当我第一次访问该页面时,它只显示circularProgressIndicator。当我第二次访问该页面时,返回后,循环ProgressIndicator会出现,其他listview.builder也会完美出现。我已经更新了有问题的代码。任何形式的帮助都将不胜感激

FutureBuilder(
future: Provider.of<AppointmentsProvider>(context, listen: false)
.fetchAndSetAvailableSlots(),
builder: (ctx, snapShot) => Column(
children: [
Container(
margin: EdgeInsets.all(5),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: Colors.blue,
),
child: SizedBox(
height: 380,
child: snapShot.connectionState == ConnectionState.waiting
? Center(
child: CircularProgressIndicator(
color: Colors.white,
),
)
: ListView.builder(
itemCount: list.length,
itemBuilder: (ctx, i) => Card(
elevation: 5,
margin: EdgeInsets.all(10),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10.0)),
child: CheckboxListTile(
secondary: Icon(
Icons.alarm,
),
activeColor: Colors.green,
// checkColor: Colors.black,
selectedTileColor: Colors.blue,
// tileColor: Colors.greenAccent,
title: Text(list[i].time),
value: list[i].isSelected,
onChanged: (value) {
onCheckChanged(list[i], list, value);
},
),
),
),
),
),
ElevatedButton.icon(
onPressed: () async {
await Firebase.initializeApp();
FirebaseFirestore.instance.collection('appointments').add({
'id': DateTime.now().toString(),
'date': widget.formatDate,
'description': 'description etc.',
'type': 'type etc.',
'uid': 'uid etc.',
'timeSlot': timeSlot,
});
},
icon: Icon(Icons.arrow_forward),
label: Text('Add Now!'),
),
],
),
);

---这是fetchAndSet函数--

Future<void> fetchAndSetAvailableSlots() async {
await Firebase.initializeApp();
QuerySnapshot<Map<String, dynamic>> data = await FirebaseFirestore.instance
.collection('appointments')
.where('date', isEqualTo: 'Dec 11, 2021')
.get();
List<TimeSlot> bookedSlots = [];
data.docs.forEach(
(element) async {
FirebaseFirestore.instance.collection('Questions').doc(userId).get();
DocumentSnapshot<Map<String, dynamic>> item = await FirebaseFirestore
.instance
.collection('appointments')
.doc('${element.id}')
.get();
bookedSlots
.add(TimeSlot(isSelected: false, time: item.data()['timeSlot']));
},
);
availableTimeSlots = bookedSlots;
print(bookedSlots);
notifyListeners();

}

首先我建议移动

Firebase.initializeApp((;

进入您的runApp函数。

关于您的第二个问题,看起来您正在使用Provider。如果是这样的话,我建议通过bool加载来确定是否等待获取数据仍在运行。此外,Futurebuilder/Streambuilder可能有助于显示这些数据。如果数据被提取,你的问题听起来像是小部件没有重建

返回ListView.builder之前,请检查列表。如果列表为空,则返回CircularProgressIndicator((;如果列表获取了一些数据,则返回listview。另一方面,将数据添加到setState((内的bookSlots列表中。

相关内容

  • 没有找到相关文章

最新更新