Flutter: How to read preferences at Widget startup?

前端 未结 2 591
眼角桃花
眼角桃花 2020-12-25 14:04

I have been trying to read preferences at Widget startup but have been unable to find a solution. I wish to show the users name in a TextField (which they can change) and st

相关标签:
2条回答
  • 2020-12-25 14:22

    I would suggest not to use the async on initState(). but you can do this in a different way by wrapping up your SharedPreferences inside another function and declaring this as async.

    I have modified your code . Please check if this works. Many Thanks.

    modified code:

    class _MyHomePageState extends State<MyHomePage> {
      TextEditingController _controller;
      String _name;
    
      Future<Null> getSharedPrefs() async {
        SharedPreferences prefs = await SharedPreferences.getInstance();
        _name = prefs.getString("name");
        setState(() {
          _controller = new TextEditingController(text: _name);
        });
      }
    
      @override
      void initState() {
        super.initState();
        _name = "";
        getSharedPrefs();  
      }
    
      @override
      Widget build(BuildContext context) {
    
        return new TextField(
                     decoration: new InputDecoration(
                       hintText: "Name (optional)",
                     ),
                     onChanged: (String str) {
                       setState(() {
                         _name = str;
                         storeName(str);
                     });
                   },
                   controller: _controller,
        );
      }
    }
    

    Let me know if this helps. Thank you.

    0 讨论(0)
  • 2020-12-25 14:23

    initState() is a synchronous function where you cannot mark async, as async convert that function into asynchronous.

    Below code helps to load shared preference values at loading time, and used to update widgets.

    @override
      void initState() {
        super.initState();
        SharedPreferences.getInstance().then((prefValue) => {
          setState(() {
            _name = prefValue.getString('name')?? "";
            _controller = new TextEditingController(text: _name);
          })
        });
      }
    
    0 讨论(0)
提交回复
热议问题