【发布时间】:2019-05-21 02:47:13
【问题描述】:
我正在尝试在加载应用程序时加载 sharedPreferences 中保存的值。但它总是给我在第一次构建时双重声明的静态列表 [0,0,0,0,0,0]。每当我触摸设置状态的东西时,它都会更改为我的正确值。我什至不需要那个静态列表,我只是声明它,因为 dart 在问我。如果那里没有保存任何内容,我想要默认列表,否则我想要 sharedpreferences 保存列表。这是我的代码。
@override initState() {
super.initState();
callLoad();
}
callLoad() async{
List<double> list = await loadTimers();
setState((){
timersList = list;
});
}
Future<List<double>> loadTimers() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
List<String> myList = prefs.getStringList('TimerList');
List<double> defaultTimersList = [30.0, 60.0, 90.0, 120.0, 150.0, 180.0];
List<double> savedTimerList;
if (myList == null ){
return defaultTimersList;
} else{
savedTimerList = myList.map((i)=> double.parse(i)).toList();
return savedTimerList;
}
}
static List<double> timersList = [0,0,0,0,0,0];
double timeRemaining1 = timersList[0];
double timeRemaining2 = timersList[1];
double timeRemaining3 = timersList[2];
double timeRemaining4 = timersList[3];
double timeRemaining5 = timersList[4];
double timeRemaining6 = timersList[5];
我也试过这种方法,但它是一样的。
@override initState() {
super.initState();
loadTimers();
}
loadTimers() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
List<String> myList = prefs.getStringList('TimerList');
List<double> defaultTimersList = [30.0, 60.0, 90.0, 120.0, 150.0, 180.0];
List<double> savedTimerList;
if (myList == null ){
setState(() {
timersList = defaultTimersList;
});
} else{
savedTimerList = myList.map((i)=> double.parse(i)).toList();
setState(() {
timersList = savedTimerList;
});
}
}
static List<double> timersList = [0,0,0,0,0,0];
double timeRemaining1 = timersList[0];
double timeRemaining2 = timersList[1];
double timeRemaining3 = timersList[2];
double timeRemaining4 = timersList[3];
double timeRemaining5 = timersList[4];
double timeRemaining6 = timersList[5];
谢谢
使用显示问题的小应用进行编辑。
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo chokuns page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
@override initState() {
super.initState();
callLoad();
}
callLoad() async{
List<double> list = await loadTimers();
setState((){
timersList = list;
});
}
Future<List<double>> loadTimers() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
List<String> myList = prefs.getStringList('TimerList');
List<double> defaultTimersList = [30.0, 60.0, 90.0, 120.0, 150.0, 180.0];
List<double> savedTimerList;
if (myList == null ){
return defaultTimersList;
} else{
savedTimerList = myList.map((i)=> double.parse(i)).toList();
return savedTimerList;
}
}
static List<double> timersList = [0,0,0,0,0,0];
double timeRemaining1 = timersList[0];
double timeRemaining2 = timersList[1];
double timeRemaining3 = timersList[2];
double timeRemaining4 = timersList[3];
double timeRemaining5 = timersList[4];
double timeRemaining6 = timersList[5];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button \nthis many times:',
textAlign: TextAlign.center,
),
Text(
'$timeRemaining1', //showing here $timersList it shows correct values
style: Theme.of(context).textTheme.display1,
),
],
),
),
);
}
}
【问题讨论】:
-
就我而言,它运作良好。构建部分如何?
-
是的,它可以工作,但第一次构建它使用静态列表
timersList 中声明的值,而不是sharedpreferences 中的值。我认为它首先绘制屏幕,然后设置值,因为在它启动后任何类型的 setstate 都会正确更新。 -
我编辑了这个问题。现在你可以用这个小例子更好地检查它。谢谢。