Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous 异步函数返回null_Asynchronous_Flutter_Dart - Fatal编程技术网

Asynchronous 异步函数返回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)

getDay()返回null而不是映射

@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;
      }

  }