Flutter.dev SharedPreferences 问题

Flutter.dev SharedPreferences questions

这是 Flutter.dev 提供的 SharedPreferences 示例的一小部分,我在使用时遇到了问题:

完整的示例代码在这里:https://flutter.dev/docs/cookbook/persistence/key-value

  int _counter = 0;

  @override
  void initState() {
    super.initState();
    _loadCounter();
  }

  //Loading counter value on start
  _loadCounter() async {
    SharedPreferences prefs = await SharedPreferences.getInstance(); // <-------------- 1
    setState(() {
      _counter = (prefs.getInt('counter') ?? 0);
    });
  }

  //Incrementing counter after click
  _incrementCounter() async {
    SharedPreferences prefs = await SharedPreferences.getInstance(); // <-------------- 1
    setState(() {
      _counter = (prefs.getInt('counter') ?? 0) + 1; // <------------------------------ 2
      prefs.setInt('counter', _counter); // <------------------------------------------ 3
    });
  }

关于这个例子我有 3 个问题:

  1. prefs变量设为全局不是更好吗?它会增加内存使用量,但不会提高性能吗?如果不是全局的,每次我们点击按钮(增加计数器)时,它都必须声明变量并分配它,因为它是异步的,我认为它会进一步降低性能。

  2. 每次我们点击按钮,都会调用函数_incrementCounter,它会从文件中获取_counter的值,为什么? _counter 变量是全局变量,我认为不需要 prefs.getInt('counter') 并且该行应该只是 _counter++;

  3. 把这行移出setState函数不是更好吗?因为来自 Flutter 开发文档:

Generally it is recommended that the setState method only be used to wrap the actual changes to the state, not any computation that might be associated with the change. https://api.flutter.dev/flutter/widgets/State/setState.html

我是一个Flutter学习新手,我需要问这个问题,这样我才能更好地理解一切。

flutter 文档面向刚开始编程的人。他们不会用您必须考虑的许多不同的事情来压倒您。 flutter 文档的初学者部分通常不会展示 flutter 和一般编程的最佳实践。您的三个答案是正确的。

  1. 是的,最好将其声明为全局变量,但仅限于使用它的class。例如,最好在顶部声明 SharedPreferences _prefs_prefs = await SharedPreferences.getInstance() inside _loadCounter().
    请注意,_ 关键字会将变量标记为私有。

  2. 你说得对。这是不必要的,您可以将其替换为 _counter++

  3. 最好将其移到 setState() 下面,这样您的屏幕将在不等待 prefs.setInt('counter', _counter); 完成的情况下重建。