Asynchronous 异步函数返回null
getDay()返回null而不是映射Asynchronous 异步函数返回null,asynchronous,flutter,dart,Asynchronous,Flutter,Dart,getDay()返回null而不是映射 @override void initState() { super.initState(); print("init"); getDay(); } void getDay() async { Future<Map<int, int>> dayExistingValueMap = dayManager.getDay(); dayExistingValueMap.then((map)
@override
void initState() {
super.initState();
print("init");
getDay();
}
void getDay() async {
Future<Map<int, int>> dayExistingValueMap = dayManager.getDay();
dayExistingValueMap.then((map) {
print('dayExisting ____ $map');
});
}
@覆盖
void initState(){
super.initState();
打印(“初始”);
getDay();
}
void getDay()异步{
Future dayExistingValueMap=dayManager.getDay();
dayExistingValueMap.then((映射){
打印(“dayExisting”地图);
});
}
但是当我在返回之前打印出来时,映射包含了所有的值
Future<Map<int, int>> getDay() async {
final Future<Database> dbFuture = databaseHelper.initializeDatabase();
dbFuture.then((database) async {
final bool checkIfExists = await databaseHelper.checkIfExist(day.dateStr);
if (checkIfExists) {
Day dbDay = await databaseHelper.getDaySingle(day.dateStr);
print('_${dbDay.valueMap}');
return dbDay.valueMap;
} else {
return this.day.valueMap;
}
});
}
Future getDay()异步{
final Future dbFuture=databaseHelper.initializeDatabase();
dbFuture.then((数据库)异步{
final bool checkIfExists=wait databaseHelper.checkIfExist(day.dateStr);
如果(检查是否存在){
Day dbDay=await databaseHelper.getDaySingle(Day.dateStr);
打印(“{dbDay.valueMap}”);
返回dbDay.valueMap;
}否则{
返回此.day.valueMap;
}
});
}
函数返回null,因为实际上没有返回任何内容。您需要返回dbFuture的结果。然后
,如下所示:
Future getDay()异步{
final Future dbFuture=databaseHelper.initializeDatabase();
返回dbFuture.then((数据库)异步{
final bool checkIfExists=wait databaseHelper.checkIfExist(day.dateStr);
如果(检查是否存在){
Day dbDay=await databaseHelper.getDaySingle(Day.dateStr);
打印(“{dbDay.valueMap}”);
返回dbDay.valueMap;
}否则{
返回此.day.valueMap;
}
});
}
Future。然后
返回一个Future
,该值完成提供的闭包的返回值。而不是return dbFuture。然后((数据库)async{
我们可以使用final database dbFuture=wait databaseHelper.initializedabase();
Future getDay()异步{
final Database dbFuture=等待databaseHelper.initializeDatabase();
final bool checkIfExists=wait databaseHelper.checkIfExist(day.dateStr);
如果(检查是否存在){
Day dbDay=await databaseHelper.getDaySingle(Day.dateStr);
打印(“{dbDay.valueMap}”);
返回dbDay.valueMap;
}否则{
返回此.day.valueMap;
}
}
您在then
中返回闭包内的值,因此就getDay
方法而言,您没有返回任何内容。我建议您根本不要使用then
,因为它会直接导致此类混淆。(更不用说调用然后
会破坏将方法标记为异步
的目的,即能够使用等待
)
Future getDay()异步{
final database=等待databaseHelper.initializeDatabase();
final bool checkIfExists=wait databaseHelper.checkIfExist(day.dateStr);
如果(检查是否存在){
Day dbDay=await databaseHelper.getDaySingle(Day.dateStr);
打印(“{dbDay.valueMap}”);
返回dbDay.valueMap;
}否则{
返回此.day.valueMap;
}
}
尝试此Future dayExistingValueMap=await dayManager.getDay();技术上正确,但此方法使异步的目的无效。我不会说“无效”是正确的词,但您是对的,充分利用async await
会更干净。无论如何,忘记从方法实际返回将始终导致其结果为空。可能不是“无效”而是“冗余”。外部方法标记为async
,但它从不wait
s任何内容,并显式返回未来。使用async wait
将产生更干净的代码,但如果没有其他内容,则此处的getDay
方法没有理由标记为async
。(就我个人而言,我不知道为什么在async
方法中显式返回future不会被dart linter标记为警告。)
Future<Map<int, int>> getDay() async {
final Database dbFuture = await databaseHelper.initializeDatabase();
final bool checkIfExists = await databaseHelper.checkIfExist(day.dateStr);
if (checkIfExists) {
Day dbDay = await databaseHelper.getDaySingle(day.dateStr);
print('_${dbDay.valueMap}');
return dbDay.valueMap;
} else {
return this.day.valueMap;
}
}