【问题标题】:'Future<dynamic>' is not a subtype of type 'String'“Future<dynamic>”不是“String”类型的子类型
【发布时间】:2020-04-28 20:01:43
【问题描述】:

我是 Flutter 的新手。我尝试学习 SharedPreferences,但我有这个例外。 我该如何解决这个问题?

类 _MyAppState 扩展状态 {

 Future<SharedPreferences> prefs = SharedPreferences.getInstance(); 
      @override
      Widget build(BuildContext context) {
        return Scaffold(
            body: Column(
              children: <Widget>[
                RaisedButton(
                  onPressed: () {addStringToSF();},
                ),
                Text(getStringValuesSF()),
              ],
            ),


        );
      }

      addStringToSF() async {
        SharedPreferences prefs = await SharedPreferences.getInstance();
        prefs.setString('stringValue', "abc");
      }

     getStringValuesSF() async {
        SharedPreferences prefs = await SharedPreferences.getInstance();
        String stringValue = prefs.getString('stringValue');
        return stringValue;
      }
    }

【问题讨论】:

  • 出现错误是因为getStringValuesSF 返回了一个未来。使用前面声明的 pref 并将函数更改为普通函数而不是 async 或使用 futurebuilder
  • 这能回答你的问题吗? What is a Future and how do I use it?

标签: flutter sharedpreferences future


【解决方案1】:

默认异步函数返回动态我们必须进行类型转换

Future<String> getStringValuesSF() async {
        SharedPreferences prefs = await SharedPreferences.getInstance();
        String stringValue = prefs.getString('stringValue');
        return stringValue;
      }

【讨论】:

  • 但这仍然不能用作 TextField 控制器的初始值。
  • @kensai 您必须在 initstate 中调用此方法并在获得值时重建。或者尝试任何状态管理方法来处理这个问题。
【解决方案2】:

我将仅扩展来自@Abhishek 的答案,因为我需要类似但在 TextFormField 上没有像预期那样工作。

所以我编写了一个简单的 loadString 方法来从 sharedPrefs 中获取任何类型的密钥:

  Future<String> loadString(String key) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    return prefs.getString(key) ?? '';
  }

接下来在同一个类中,我创建了 init form void 以使用上述方法(无论如何,我仍然认为这种使用 Future 的方式在 Dart 中不是最佳的......),这会将数据加载到控制器中:

Future<void> _initForm() async {
    final clientBusinessRegistrationID = await loadString('clientBusinessRegistrationID');
    _clientBusinessRegistrationIDController.value =
        _clientBusinessRegistrationIDController.value.copyWith(
            text: clientBusinessRegistrationID);
}

我也在同一个类中添加了这个块:

 SharedPreferences? preferences;
  Future<void> initializePreference() async{
    preferences = await SharedPreferences.getInstance();
  }

最后在 initState() 中我调用它并且它起作用了:

  @override
  void initState()   {
    super.initState();
    // setupLocator();

    initializePreference().whenComplete((){
      setState(() {});
    });

    _clientBusinessRegistrationIDController.text = 'Initial';
    _initForm();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-09
    • 2020-09-24
    • 2020-09-11
    • 2020-10-13
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 2021-02-10
    相关资源
    最近更新 更多