无法获取Widget小部件的未来值



我有一个列表视图,如果条件成立,我想从firebase获得每个listTile的finishedDate。但是我得到一个错误future不是DateTime 的子类型

我做了什么:

@override
Widget build(BuildContext context) {
return ListView.builder(
itemCount: widget.servineraProviders!.length,
itemBuilder: (context, int currentIndex){
DateTime? finishedDate;
String state = widget.servineraProviders![currentIndex].providerState;
if(state == "Serving")
finishedDate = getFinishedDate(widget.servineraProviders![currentIndex].providerID);
return Stack(
children: <Widget>[
Container(
width:double.infinity,
color: Colors.grey[50],
child: state == "Serving" ? Text(finishedDate.toString) : Text("provider is available")
)
],
);
},
);
}

finishedDate函数如下

getFinishedDate(providerID)async {
DateTime dt = await DatabaseService().getFinishedTimeOfService(providerID);
return dt;
}

则getFinishedTiumofService:

Future<DateTime> getFinishedTimeOfService(providerID) async {
DateTime finishedDate = DateTime.now();
try{
await ordersCollection
.where('orderStatus', isEqualTo: 'inprogress')
.where('providerID', isEqualTo: providerID)
.get()
.then((querySnapshot){
var doc = querySnapshot.docs[0].data() as Map<String, dynamic>;
DateTime timeArrived =  doc['timeArrived'].toDate();//DateFormat("hh:mm").parse('${data[0].timeArrived}');
List<String> parts = doc['estimatedTime'].split(':');
int hours = 0, minutes = 0;
if(parts.length > 2) hours = int.parse(parts[parts.length - 3]);
if(parts.length > 1) minutes = int.parse(parts[parts.length -2]);
Duration d = Duration(hours: hours, minutes: minutes);
finishedDate = timeArrived.add(d);
});
return finishedDate;
}catch(e){
print(e.toString());
return DateTime.now();
}
}

您可以使用Future Builder 包装Stack小部件

使用Future Builder包装小部件

只需用FutureBuilder小部件包装您的Stack小部件,并将getFinishedDate方法传递给FutureBuilder 的future属性

@override
Widget build(BuildContext context) {
return ListView.builder(
itemCount: widget.servineraProviders!.length,
itemBuilder: (context, int currentIndex){
DateTime? finishedDate;
String state = widget.servineraProviders![currentIndex].providerState;
return FutureBuilder(
future: getFinishedDate(widget.servineraProviders![currentIndex].providerID),
builder: (context, snapshot) {
if (snapshot.hasData && !snapshot.hasError) {
return Stack(
children: <Widget>[
Container(
width: double.infinity,
color: Colors.grey[50],
child: Text(snapshot.data.toString)
)
],
);
} else if (snapshot.hasError){
print(snapshot.error.toString());
return Text(snapshot.error.toString());
} else {
return CircularProgressIndicator();
}
}
);
},
);
}

相关内容

最新更新