Dart null-safety 破坏 Future<bool> 匿名方法?

Dart null-safety breaks Future<bool> anonymous method?

在迁移到空安全之前,这是可行的。这是一种用户登录验证方式。

Future<bool> loginValidate() async {
    final String dir = await getDocDir(); //getting documents directory
    try {
      await File('$dir/$_userLoginString.json')
          .readAsString()
          .then((String contents) {
        final json = jsonDecode(contents) as Map<String, dynamic>;
        final user = PersonLoginJson.fromJson(json);
        if (_userPasswordString != user.password) {
          //invalid password
          return Future<bool>.value(false);
        }
      });
    } on FileSystemException {
      //invalid username
      return Future<bool>.value(false);
    } catch (e) {
      return Future<bool>.value(false);
    }
    //success
    return Future<bool>.value(true);
  }

此 error 在构建应用程序时发生。

我认为这与 .then() 方法中的匿名函数参数有关。

if (_userPasswordString != user.password) {
  //invalid password
  return Future<bool>.value(false);
} else {
  return Future<bool>.value(true);   // <--- here needed
}

您需要 return await 函数,还需要设置 true 值以使其工作:

return await File('$dir/$_userLoginString.json')
          .readAsString()
          .then((String contents) {
        final json = jsonDecode(contents) as Map<String, dynamic>;
        final user = PersonLoginJson.fromJson(json);
        if (_userPasswordString != user.password) {
          //invalid password
          return Future<bool>.value(false);
        }

        //Also need this code as it will return null if not set
        return Future<bool>.value(true);
      });

我认为更好的方式:

让我们更改此代码:

await File('$dir/$_userLoginString.json')
          .readAsString()
          .then((String contents) {
        final json = jsonDecode(contents) as Map<String, dynamic>;
        final user = PersonLoginJson.fromJson(json);
        if (_userPasswordString != user.password) {
          //invalid password
          return Future<bool>.value(false);
        }
      });

对此:

String contents = await File('$dir/$_userLoginString.json').readAsString();
final json = jsonDecode(contents) as Map<String, dynamic>;
final user = PersonLoginJson.fromJson(json);
if (_userPasswordString != user.password) {
   //invalid password
   return Future<bool>.value(false);
}

那么现在调试你的代码会更容易。