Флаттер. Использование конструктора, который возвращает dynamic, но на самом деле нуждается в Future

#string #flutter #dart

#строка #flutter #dart

Вопрос:

Я пытаюсь использовать приведенный ниже sharedPreferenceBuilder Саймона Лайтфута.

 class SharedPreferencesBuilder<T> extends StatelessWidget {
    final String pref;
    final AsyncWidgetBuilder<T> builder;

     const SharedPreferencesBuilder({
        Key key,
        @required this.pref,
        @required this.builder,
    }) : super(key: key);

    @override
    Widget build(BuildContext context) {
        return FutureBuilder<T>(
            future: _future(),
            builder: (BuildContext context, AsyncSnapshot<T> snapshot) {
                return builder(context, snapshot);
            });
    }

    Future<T> _future() async {
        return (await SharedPreferences.getInstance()).get(pref); <-------- Here is the issue
    }
}
  

К сожалению, функция _future() возвращает динамический тип вместо Future . Я попытался поместить as Future<T> в конец возврата, но это все равно не сработало.

Есть ли какой-либо способ преобразовать динамический тип в Future?

Я также был явным и поменял <T> местами for <String> , но это тоже не сработало.

Спасибо за любую помощь, которую вы можете предоставить.

Комментарии:

1. Попробуйте вернуть (Future.value(SharedPreferences.getInstance()).get(pref) as dynamic)); также с помощью await, и Future будет избыточным. Если вы хотите, чтобы это было future, вы должны вызвать метод with _future().then((value) => {value here will be the value of your sharedPref.get()}) . В принципе, я бы удалил Future .

2. Спасибо, что вернулись. К сожалению, я все еще получаю ту же ошибку «Возвращаемый тип ‘dynamic’ не является ‘FutureOr<T>’, как того требует контекст закрытия».

3. Я протестировал ваш код, и он работает, ошибок нет.

4. хорошо, спасибо. тогда, должно быть, что-то не так с моим концом.