【问题标题】:Flutter.dev SharedPreferences questionsFlutter.dev SharedPreferences 问题
【发布时间】:2021-01-03 09:00:56
【问题描述】:

这是 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 开发文档:

通常建议 setState 方法仅用于包装对状态的实际更改,而不是任何可能与更改相关联的计算。 https://api.flutter.dev/flutter/widgets/State/setState.html

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

【问题讨论】:

    标签: flutter sharedpreferences


    【解决方案1】:

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

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

    2. 你说得对。这是不必要的,你可以用_counter++替换它

    3. 最好把它移到setState()下面,这样你的屏幕就可以在不等待prefs.setInt('counter', _counter);完成的情况下重建。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多