Вы не указали тип при использовании Future.then
, поэтому он должен быть выведен. Поскольку вы возвращаете null
, он не знает, какого типа он должен быть, поэтому ваш вызов Future.then
не возвращает Future<String>
.
Вы можете помочь движку вывода, явно указав тип через then<String>(...)
:
Future<String> _initPreferences() {
return SharedPreferences.getInstance().then<String>((prefs) {
_prefs = prefs;
return null;
}).catchError((vError) {
return "Unable to load categories";
});
}
хотя еще лучше было бы просто использовать async
и await
:
Future<String> _initPreferences() async {
try {
final prefs = await SharedPreferences.getInstance();
_prefs = prefs;
return null;
} catch (vError) {
return "Unable to load categories";
}
}
Вот более простой случай воспроизведения:
Future<String> foo() {
final future = Future(() => null);
print('${future.runtimeType}');
return future;
}
Future<void> main() async {
await foo();
}
Я бы ожидал, что future
будет Future<Null>
, но вместо этого получится Future<dynamic>
, и я не уверен почему. (Null
является особенным и позволяет присваивать Future<Null>
для Future<T>
.) Я подозреваю, что это может быть ошибкой, поскольку dartanalyzer
не генерирует никаких предупреждений об этом. (И вопреки тому, что говорится в некоторых комментариях, это не является чем-то новым для Dart 2.4.0; я пробовал использовать Dart 2.3.0, 2.3.2 и 2.4.0.) Я подал вопрос о он .