【问题标题】:Flutter: fill a textfield with a string on shared preferencesFlutter:用共享首选项上的字符串填充文本字段
【发布时间】:2020-07-21 04:17:13
【问题描述】:

我正在尝试使用存储在共享首选项中的字符串填充文本字段,但我不明白该怎么做。

案例是:

1 - 我在第一个屏幕上登录。

2 - 用户名保存在共享首选项中。

3 - 然后用一些文本字段调用第二个屏幕。

4 - 用户名字段应填写已保存的用户。

这是我在第一个屏幕上存储用户名的方式:

 final prefs = await SharedPreferences.getInstance();
                      final key = 'user';
                      final value = loggedUser;
                      prefs.setString(key, value);
                      print('saved $value');

这是我在第二个屏幕上用来检索用户名的函数:

 static _read() async {
    final prefs = await SharedPreferences.getInstance();
    final key = 'user';
    final value = prefs.getString(key);
    print('saved $value');
    String usu = value;
  }

我可以在第二个屏幕上加载用户名,但我不能把它放在文本字段上,我该怎么做?

我已经尝试对函数进行一些修改(如下),他们在文本控制器上传递了函数但没有用,我猜这不是正确的方法。

  static _read() async {
    final prefs = await SharedPreferences.getInstance();
    final key = 'usuario';
    final value = prefs.getString(key);
    print('saved $value');
    String usu = value;
    return usu; //the modification
  }

控制器:

final _pecasController = TextEditingController(text: _read());

【问题讨论】:

  • 添加您为 TextField 尝试过的内容
  • 我刚刚更新
  • 试试 _read().then((String name) => name);
  • 在控制器上?我这样做并得到错误:类型'(String)=> String'不是类型'(dynamic)=> FutureOf(dynamic> of 'f'的子类型
  • @abrev 请先在你的状态下调用这个 _read() 方法,然后你就可以从你的共享偏好中获得价值。然后只需将您的 usu 传递给文本字段,就像这样 final _pecasController = TextEditingController(text: usu);

标签: android flutter sharedpreferences


【解决方案1】:

我终于做到了。

感谢在这里发表评论并帮助我的人,它没有工作,所以我进行了搜索,终于设法让它工作。

这是代码

功能:

 static _read() async {
    final prefs = await SharedPreferences.getInstance();
    final key = 'usuario';
    final value = prefs.getString(key);
    print('saved tester $value');
    String usu = value;
    return usu;

  }

初始化状态:

  @override
  void initState() {
    super.initState();
    _read();

    WidgetsBinding.instance.addPostFrameCallback((_) async {
      _usuarioController.text = await _read();
    });

我不知道这是否是最好的方法,但它确实有效,这就是我现在所需要的。

【讨论】:

    【解决方案2】:

    因为我在同一条船上,即使这个答案是旧的,我觉得我想给出一个答案。我会在 cmets 中发布此内容,但无法在 atm 上发布。

    @override
      void initState() {
        super.initState();
        WidgetsBinding.instance.addPostFrameCallback((_) async {
          await _read();
        });
      }
    

    初始代码可以更小,不需要在WidgetsBinding之前加载_read()。它所做的只是调用它两次。为了便于阅读,我还建议缩短 _read() 调用,并使其成为正常的 Future,这样你就可以确定返回类型是 String。还将价值观私有化。

    Future<void> _read() async {
        final _prefs = await SharedPreferences.getInstance();
        final _value = _prefs.getString('usuario');
        print('saved tester $_value');
        setState(() {
          _usuarioController.text = value;
        });
      
      }
    

    我知道之前的答案是正确的并且有效,但这样更好。

    【讨论】:

      【解决方案3】:

      这对你有用吗?

      class TheState extends State<TheWidget> {
      
        TextEditingController _pecasController = TextEditingController();
      
        @override
        void initState() async {
          _pecasController.text = await _read();
        }
      

      【讨论】:

      • 我尝试过,但出现错误。当我尝试使用 initstate async 时,我得到一个错误,这个函数不能是异步的,当我尝试不使用 async 时,我得到错误“类型未来动态不是字符串的子类型”
      猜你喜欢
      • 2018-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-28
      • 2021-06-24
      • 1970-01-01
      相关资源
      最近更新 更多