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 个问题:
把prefs
变量设为全局不是更好吗?它会增加内存使用量,但不会提高性能吗?如果不是全局的,每次我们点击按钮(增加计数器)时,它都必须声明变量并分配它,因为它是异步的,我认为它会进一步降低性能。
每次我们点击按钮,都会调用函数_incrementCounter
,它会从文件中获取_counter
的值,为什么? _counter
变量是全局变量,我认为不需要 prefs.getInt('counter')
并且该行应该只是 _counter++
;
把这行移出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 和一般编程的最佳实践。您的三个答案是正确的。
是的,最好将其声明为全局变量,但仅限于使用它的class。例如,最好在顶部声明 SharedPreferences _prefs
和 _prefs = await SharedPreferences.getInstance() inside _loadCounter()
.
请注意,_ 关键字会将变量标记为私有。
你说得对。这是不必要的,您可以将其替换为 _counter++
最好将其移到 setState()
下面,这样您的屏幕将在不等待 prefs.setInt('counter', _counter);
完成的情况下重建。
这是 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 个问题:
把
prefs
变量设为全局不是更好吗?它会增加内存使用量,但不会提高性能吗?如果不是全局的,每次我们点击按钮(增加计数器)时,它都必须声明变量并分配它,因为它是异步的,我认为它会进一步降低性能。每次我们点击按钮,都会调用函数
_incrementCounter
,它会从文件中获取_counter
的值,为什么?_counter
变量是全局变量,我认为不需要prefs.getInt('counter')
并且该行应该只是_counter++
;把这行移出
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 和一般编程的最佳实践。您的三个答案是正确的。
是的,最好将其声明为全局变量,但仅限于使用它的class。例如,最好在顶部声明
SharedPreferences _prefs
和_prefs = await SharedPreferences.getInstance() inside _loadCounter()
.
请注意,_ 关键字会将变量标记为私有。你说得对。这是不必要的,您可以将其替换为
_counter++
最好将其移到
setState()
下面,这样您的屏幕将在不等待prefs.setInt('counter', _counter);
完成的情况下重建。