如何优化此 Flutter 代码以减少工作量?
How to optimize this Flutter code so it does less work?
我的应用程序做的工作太多了。我该如何优化这段代码?我不知道如何更改它并仍然从中获得相同的效果!
我需要将每个变量都保存在 phone 上,这样我总能回到那个状态。
我试图将每天的分数保存在它自己的变量中,因为我不知道如何以不同的方式返回它。
如你所见,我是初学者。
代码:
_loadDay() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
setState(() {
_day = (prefs.getInt('day') ?? 0);
day = _day -1;
_score=_counter[day];
});
}
_loadCounter() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
setState(() {
if(_day==1){
_counter[day] = (prefs.getInt('counter1') ?? 0);
_score=_counter[day];
}
if(_day==2){
_counter[day] = (prefs.getInt('counter2') ?? 0);
_score=_counter[day];
}
if(_day==3){
_counter[day] = (prefs.getInt('counter3') ?? 0);
_score=_counter[day];
}
if(_day==4){
_counter[day] = (prefs.getInt('counter4') ?? 0);
_score=_counter[day];
}
if(_day==5){
_counter[day] = (prefs.getInt('counter5') ?? 0);
_score=_counter[day];
}
if(_day==6){
_counter[day] = (prefs.getInt('counter6') ?? 0);
_score=_counter[day];
}if(_day==7){
_counter[day] = (prefs.getInt('counter7') ?? 0);
_score=_counter[day];
}
if(_day==8){
_counter[day] = (prefs.getInt('counter8') ?? 0);
_score=_counter[day];
}
if(_day==9){
_counter[day] = (prefs.getInt('counter9') ?? 0);
_score=_counter[day];
}
if(_day==10){
_counter[day] = (prefs.getInt('counter10') ?? 0);
_score=_counter[day];
}
if(_day==11){
_counter[day] = (prefs.getInt('counter11') ?? 0);
_score=_counter[day];
}
if(_day==12){
_counter[day] = (prefs.getInt('counter12') ?? 0);
_score=_counter[day];
}if(_day==13){
_counter[day] = (prefs.getInt('counter13') ?? 0);
_score=_counter[day];
}
if(_day==14){
_counter[day] = (prefs.getInt('counter14') ?? 0);
_score=_counter[day];
}
if(_day==15){
_counter[day] = (prefs.getInt('counter15') ?? 0);
_score=_counter[day];
}
if(_day==16){
_counter[day] = (prefs.getInt('counter16') ?? 0);
_score=_counter[day];
}
if(_day==17){
_counter[day] = (prefs.getInt('counter17') ?? 0);
_score=_counter[day];
}
if(_day==18){
_counter[day] = (prefs.getInt('counter18') ?? 0);
_score=_counter[day];
}
if(_day==19){
_counter[day] = (prefs.getInt('counter19') ?? 0);
_score=_counter[day];
}
if(_day==20){
_counter[day] = (prefs.getInt('counter20') ?? 0);
_score=_counter[day];
}
if(_day==21){
_counter[day] = (prefs.getInt('counter21') ?? 0);
_score=_counter[day];
}
if(_day==22){
_counter[day] = (prefs.getInt('counter22') ?? 0);
_score=_counter[day];
}
if(_day==23){
_counter[day] = (prefs.getInt('counter23') ?? 0);
_score=_counter[day];
}
if(_day==24){
_counter[day] = (prefs.getInt('counter24') ?? 0);
_score=_counter[day];
}
if(_day==25){
_counter[day] = (prefs.getInt('counter25') ?? 0);
_score=_counter[day];
}
if(_day==26){
_counter[day] = (prefs.getInt('counter26') ?? 0);
_score=_counter[day];
}
if(_day==27){
_counter[day] = (prefs.getInt('counter27') ?? 0);
_score=_counter[day];
}
if(_day==28){
_counter[day] = (prefs.getInt('counter28') ?? 0);
_score=_counter[day];
}
if(_day==29){
_counter[day] = (prefs.getInt('counter29') ?? 0);
_score=_counter[day];
}
if(_day==30){
_counter[day] = (prefs.getInt('counter30') ?? 0);
_score=_counter[day];
}
});
}
//Incrementing counter after click
_incrementCounter() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
setState(() {
if(_day==1){
_loadCounter();
_counter[day] = (prefs.getInt('counter1') ?? 0) + 1;
prefs.setInt('counter1', _counter[day]);
_score=_counter[day];
}
if(_day==2){
_loadCounter();
_counter[day] = (prefs.getInt('counter2') ?? 0) + 1;
prefs.setInt('counter2', _counter[day]);
_score=_counter[day];
}
if(_day==3){
_loadCounter();
_counter[day] = (prefs.getInt('counter3') ?? 0) + 1;
prefs.setInt('counter3', _counter[day]);
_score=_counter[day];
}
if(_day==4){
_loadCounter();
_counter[day] = (prefs.getInt('counter4') ?? 0) + 1;
prefs.setInt('counter4', _counter[day]);
_score=_counter[day];
}
if(_day==5){
_loadCounter();
_counter[day] = (prefs.getInt('counter5') ?? 0) + 1;
prefs.setInt('counter5', _counter[day]);
_score=_counter[day];
}
if(_day==6){
_loadCounter();
_counter[day] = (prefs.getInt('counter6') ?? 0) + 1;
prefs.setInt('counter6', _counter[day]);
_score=_counter[day];
}
if(_day==7){
_loadCounter();
_counter[day] = (prefs.getInt('counter7') ?? 0) + 1;
prefs.setInt('counter7', _counter[day]);
_score=_counter[day];
}
if(_day==8){
_loadCounter();
_counter[day] = (prefs.getInt('counter8') ?? 0) + 1;
prefs.setInt('counter8', _counter[day]);
_score=_counter[day];
}
if(_day==9){
_loadCounter();
_counter[day] = (prefs.getInt('counter9') ?? 0) + 1;
prefs.setInt('counter9', _counter[day]);
_score=_counter[day];
}
if(_day==10){
_loadCounter();
_counter[day] = (prefs.getInt('counter10') ?? 0) + 1;
prefs.setInt('counter10', _counter[day]);
_score=_counter[day];
}
if(_day==11){
_loadCounter();
_counter[day] = (prefs.getInt('counter11') ?? 0) + 1;
prefs.setInt('counter11', _counter[day]);
_score=_counter[day];
}
if(_day==12){
_loadCounter();
_counter[day] = (prefs.getInt('counter12') ?? 0) + 1;
prefs.setInt('counter12', _counter[day]);
_score=_counter[day];
}
if(_day==13){
_loadCounter();
_counter[day] = (prefs.getInt('counter13') ?? 0) + 1;
prefs.setInt('counter13', _counter[day]);
_score=_counter[day];
}
if(_day==14){
_loadCounter();
_counter[day] = (prefs.getInt('counter14') ?? 0) + 1;
prefs.setInt('counter14', _counter[day]);
_score=_counter[day];
}
if(_day==15){
_loadCounter();
_counter[day] = (prefs.getInt('counter15') ?? 0) + 1;
prefs.setInt('counter15', _counter[day]);
_score=_counter[day];
}
if(_day==16){
_loadCounter();
_counter[day] = (prefs.getInt('counter16') ?? 0) + 1;
prefs.setInt('counter16', _counter[day]);
_score=_counter[day];
}
if(_day==17){
_loadCounter();
_counter[day] = (prefs.getInt('counter17') ?? 0) + 1;
prefs.setInt('counter17', _counter[day]);
_score=_counter[day];
}
if(_day==18){
_loadCounter();
_counter[day] = (prefs.getInt('counter18') ?? 0) + 1;
prefs.setInt('counter18', _counter[day]);
_score=_counter[day];
}
if(_day==19){
_loadCounter();
_counter[day] = (prefs.getInt('counter19') ?? 0) + 1;
prefs.setInt('counter19', _counter[day]);
_score=_counter[day];
}
if(_day==20){
_loadCounter();
_counter[day] = (prefs.getInt('counter20') ?? 0) + 1;
prefs.setInt('counter20', _counter[day]);
_score=_counter[day];
}
if(_day==21){
_loadCounter();
_counter[day] = (prefs.getInt('counter21') ?? 0) + 1;
prefs.setInt('counter21', _counter[day]);
_score=_counter[day];
}
if(_day==22){
_loadCounter();
_counter[day] = (prefs.getInt('counter22') ?? 0) + 1;
prefs.setInt('counter22', _counter[day]);
_score=_counter[day];
}
if(_day==23){
_loadCounter();
_counter[day] = (prefs.getInt('counter23') ?? 0) + 1;
prefs.setInt('counter23', _counter[day]);
_score=_counter[day];
}
if(_day==24){
_loadCounter();
_counter[day] = (prefs.getInt('counter24') ?? 0) + 1;
prefs.setInt('counter24', _counter[day]);
_score=_counter[day];
}
if(_day==25){
_loadCounter();
_counter[day] = (prefs.getInt('counter25') ?? 0) + 1;
prefs.setInt('counter25', _counter[day]);
_score=_counter[day];
}
if(_day==26){
_loadCounter();
_counter[day] = (prefs.getInt('counter26') ?? 0) + 1;
prefs.setInt('counter26', _counter[day]);
_score=_counter[day];
}
if(_day==27){
_loadCounter();
_counter[day] = (prefs.getInt('counter27') ?? 0) + 1;
prefs.setInt('counter27', _counter[day]);
_score=_counter[day];
}
if(_day==28){
_loadCounter();
_counter[day] = (prefs.getInt('counter28') ?? 0) + 1;
prefs.setInt('counter28', _counter[day]);
_score=_counter[day];
}
if(_day==29){
_loadCounter();
_counter[day] = (prefs.getInt('counter29') ?? 0) + 1;
prefs.setInt('counter29', _counter[day]);
_score=_counter[day];
}
if(_day==30){
_loadCounter();
_counter[day] = (prefs.getInt('counter30') ?? 0) + 1;
prefs.setInt('counter30', _counter[day]);
_score=_counter[day];
}
});
}
为了使您的代码更简洁,请先使用 Dart 为您提供的字符串插值。
像这样
setState(() {
if(day > 0 && day <=30) {
_counter[day] = (prefs.getInt('counter$day') ?? 0);
_score=_counter[day];
}
});
如您所见,通过在字符串中使用 $ 符号,您可以将其替换为 day
的值
好了,完成后,您可以进行以下操作。
您不需要在每次要对其执行操作时都获取 SharedPreferences 实例。
我建议您将它存储在一个可以从两个函数访问的变量中。
例如,您可以使用 FutureBuilder:
...
FutureBuilder(
future: () => _getSharedPrefInstance(),
builder: (context, snapshot) {
if(snapshot.hasData){
return YourWidgetHere();
} else {
return CircularProgressIndicator();
}
},
);
...
Future<SharedPreferences> _getSharedPreferences() async {
final instance = await SharedPreferences.getInstance();
setState(() async {
prefs= instance;
});
return instance;
}
...
所以在这里,我们正在做的是利用 FutureBuilder
小部件。这将等待 Future,在等待 Future 完成时它会显示 CircularProgressIndicator
,然后,当 Future 得到解决时,它会显示加载的小部件 YourWidgetHere
.
我们还 await
用于另一个函数中的 SharedPreferences。此函数将等待实例,然后将其保存在变量中,以便您可以从函数中访问它 (_loadDay
& _incrementCounter
).
从这些函数中,您可以调用 prefs.getInt
& prefs.setInt
。
这将提高您的代码速度。
我认为您可以像这样优化 _loadCounter
方法:
_loadCounter() async {
if (_day > 0 && _day < 31) {
final prefs = await SharedPreferences.getInstance();
final value = prefs.getInt('counter$_day') ?? 0;
setState(() {
_counter[day] = value;
_score = value;
});
}
}
你可以做类似于 _incrementCounter
的事情。
我注意到的一件事是你在 day
和 _day
之间做 +1 和 -1;你需要这两个吗?如果不是,您也许可以使用相同的值。作为名称建议,我会使用 dayIndex
而不是 day
.
第二个注意事项,从 SharedPreferences
存储和检索值不是很快。您可能想改用 Hive
包。
我的应用程序做的工作太多了。我该如何优化这段代码?我不知道如何更改它并仍然从中获得相同的效果! 我需要将每个变量都保存在 phone 上,这样我总能回到那个状态。
我试图将每天的分数保存在它自己的变量中,因为我不知道如何以不同的方式返回它。
如你所见,我是初学者。
代码:
_loadDay() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
setState(() {
_day = (prefs.getInt('day') ?? 0);
day = _day -1;
_score=_counter[day];
});
}
_loadCounter() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
setState(() {
if(_day==1){
_counter[day] = (prefs.getInt('counter1') ?? 0);
_score=_counter[day];
}
if(_day==2){
_counter[day] = (prefs.getInt('counter2') ?? 0);
_score=_counter[day];
}
if(_day==3){
_counter[day] = (prefs.getInt('counter3') ?? 0);
_score=_counter[day];
}
if(_day==4){
_counter[day] = (prefs.getInt('counter4') ?? 0);
_score=_counter[day];
}
if(_day==5){
_counter[day] = (prefs.getInt('counter5') ?? 0);
_score=_counter[day];
}
if(_day==6){
_counter[day] = (prefs.getInt('counter6') ?? 0);
_score=_counter[day];
}if(_day==7){
_counter[day] = (prefs.getInt('counter7') ?? 0);
_score=_counter[day];
}
if(_day==8){
_counter[day] = (prefs.getInt('counter8') ?? 0);
_score=_counter[day];
}
if(_day==9){
_counter[day] = (prefs.getInt('counter9') ?? 0);
_score=_counter[day];
}
if(_day==10){
_counter[day] = (prefs.getInt('counter10') ?? 0);
_score=_counter[day];
}
if(_day==11){
_counter[day] = (prefs.getInt('counter11') ?? 0);
_score=_counter[day];
}
if(_day==12){
_counter[day] = (prefs.getInt('counter12') ?? 0);
_score=_counter[day];
}if(_day==13){
_counter[day] = (prefs.getInt('counter13') ?? 0);
_score=_counter[day];
}
if(_day==14){
_counter[day] = (prefs.getInt('counter14') ?? 0);
_score=_counter[day];
}
if(_day==15){
_counter[day] = (prefs.getInt('counter15') ?? 0);
_score=_counter[day];
}
if(_day==16){
_counter[day] = (prefs.getInt('counter16') ?? 0);
_score=_counter[day];
}
if(_day==17){
_counter[day] = (prefs.getInt('counter17') ?? 0);
_score=_counter[day];
}
if(_day==18){
_counter[day] = (prefs.getInt('counter18') ?? 0);
_score=_counter[day];
}
if(_day==19){
_counter[day] = (prefs.getInt('counter19') ?? 0);
_score=_counter[day];
}
if(_day==20){
_counter[day] = (prefs.getInt('counter20') ?? 0);
_score=_counter[day];
}
if(_day==21){
_counter[day] = (prefs.getInt('counter21') ?? 0);
_score=_counter[day];
}
if(_day==22){
_counter[day] = (prefs.getInt('counter22') ?? 0);
_score=_counter[day];
}
if(_day==23){
_counter[day] = (prefs.getInt('counter23') ?? 0);
_score=_counter[day];
}
if(_day==24){
_counter[day] = (prefs.getInt('counter24') ?? 0);
_score=_counter[day];
}
if(_day==25){
_counter[day] = (prefs.getInt('counter25') ?? 0);
_score=_counter[day];
}
if(_day==26){
_counter[day] = (prefs.getInt('counter26') ?? 0);
_score=_counter[day];
}
if(_day==27){
_counter[day] = (prefs.getInt('counter27') ?? 0);
_score=_counter[day];
}
if(_day==28){
_counter[day] = (prefs.getInt('counter28') ?? 0);
_score=_counter[day];
}
if(_day==29){
_counter[day] = (prefs.getInt('counter29') ?? 0);
_score=_counter[day];
}
if(_day==30){
_counter[day] = (prefs.getInt('counter30') ?? 0);
_score=_counter[day];
}
});
}
//Incrementing counter after click
_incrementCounter() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
setState(() {
if(_day==1){
_loadCounter();
_counter[day] = (prefs.getInt('counter1') ?? 0) + 1;
prefs.setInt('counter1', _counter[day]);
_score=_counter[day];
}
if(_day==2){
_loadCounter();
_counter[day] = (prefs.getInt('counter2') ?? 0) + 1;
prefs.setInt('counter2', _counter[day]);
_score=_counter[day];
}
if(_day==3){
_loadCounter();
_counter[day] = (prefs.getInt('counter3') ?? 0) + 1;
prefs.setInt('counter3', _counter[day]);
_score=_counter[day];
}
if(_day==4){
_loadCounter();
_counter[day] = (prefs.getInt('counter4') ?? 0) + 1;
prefs.setInt('counter4', _counter[day]);
_score=_counter[day];
}
if(_day==5){
_loadCounter();
_counter[day] = (prefs.getInt('counter5') ?? 0) + 1;
prefs.setInt('counter5', _counter[day]);
_score=_counter[day];
}
if(_day==6){
_loadCounter();
_counter[day] = (prefs.getInt('counter6') ?? 0) + 1;
prefs.setInt('counter6', _counter[day]);
_score=_counter[day];
}
if(_day==7){
_loadCounter();
_counter[day] = (prefs.getInt('counter7') ?? 0) + 1;
prefs.setInt('counter7', _counter[day]);
_score=_counter[day];
}
if(_day==8){
_loadCounter();
_counter[day] = (prefs.getInt('counter8') ?? 0) + 1;
prefs.setInt('counter8', _counter[day]);
_score=_counter[day];
}
if(_day==9){
_loadCounter();
_counter[day] = (prefs.getInt('counter9') ?? 0) + 1;
prefs.setInt('counter9', _counter[day]);
_score=_counter[day];
}
if(_day==10){
_loadCounter();
_counter[day] = (prefs.getInt('counter10') ?? 0) + 1;
prefs.setInt('counter10', _counter[day]);
_score=_counter[day];
}
if(_day==11){
_loadCounter();
_counter[day] = (prefs.getInt('counter11') ?? 0) + 1;
prefs.setInt('counter11', _counter[day]);
_score=_counter[day];
}
if(_day==12){
_loadCounter();
_counter[day] = (prefs.getInt('counter12') ?? 0) + 1;
prefs.setInt('counter12', _counter[day]);
_score=_counter[day];
}
if(_day==13){
_loadCounter();
_counter[day] = (prefs.getInt('counter13') ?? 0) + 1;
prefs.setInt('counter13', _counter[day]);
_score=_counter[day];
}
if(_day==14){
_loadCounter();
_counter[day] = (prefs.getInt('counter14') ?? 0) + 1;
prefs.setInt('counter14', _counter[day]);
_score=_counter[day];
}
if(_day==15){
_loadCounter();
_counter[day] = (prefs.getInt('counter15') ?? 0) + 1;
prefs.setInt('counter15', _counter[day]);
_score=_counter[day];
}
if(_day==16){
_loadCounter();
_counter[day] = (prefs.getInt('counter16') ?? 0) + 1;
prefs.setInt('counter16', _counter[day]);
_score=_counter[day];
}
if(_day==17){
_loadCounter();
_counter[day] = (prefs.getInt('counter17') ?? 0) + 1;
prefs.setInt('counter17', _counter[day]);
_score=_counter[day];
}
if(_day==18){
_loadCounter();
_counter[day] = (prefs.getInt('counter18') ?? 0) + 1;
prefs.setInt('counter18', _counter[day]);
_score=_counter[day];
}
if(_day==19){
_loadCounter();
_counter[day] = (prefs.getInt('counter19') ?? 0) + 1;
prefs.setInt('counter19', _counter[day]);
_score=_counter[day];
}
if(_day==20){
_loadCounter();
_counter[day] = (prefs.getInt('counter20') ?? 0) + 1;
prefs.setInt('counter20', _counter[day]);
_score=_counter[day];
}
if(_day==21){
_loadCounter();
_counter[day] = (prefs.getInt('counter21') ?? 0) + 1;
prefs.setInt('counter21', _counter[day]);
_score=_counter[day];
}
if(_day==22){
_loadCounter();
_counter[day] = (prefs.getInt('counter22') ?? 0) + 1;
prefs.setInt('counter22', _counter[day]);
_score=_counter[day];
}
if(_day==23){
_loadCounter();
_counter[day] = (prefs.getInt('counter23') ?? 0) + 1;
prefs.setInt('counter23', _counter[day]);
_score=_counter[day];
}
if(_day==24){
_loadCounter();
_counter[day] = (prefs.getInt('counter24') ?? 0) + 1;
prefs.setInt('counter24', _counter[day]);
_score=_counter[day];
}
if(_day==25){
_loadCounter();
_counter[day] = (prefs.getInt('counter25') ?? 0) + 1;
prefs.setInt('counter25', _counter[day]);
_score=_counter[day];
}
if(_day==26){
_loadCounter();
_counter[day] = (prefs.getInt('counter26') ?? 0) + 1;
prefs.setInt('counter26', _counter[day]);
_score=_counter[day];
}
if(_day==27){
_loadCounter();
_counter[day] = (prefs.getInt('counter27') ?? 0) + 1;
prefs.setInt('counter27', _counter[day]);
_score=_counter[day];
}
if(_day==28){
_loadCounter();
_counter[day] = (prefs.getInt('counter28') ?? 0) + 1;
prefs.setInt('counter28', _counter[day]);
_score=_counter[day];
}
if(_day==29){
_loadCounter();
_counter[day] = (prefs.getInt('counter29') ?? 0) + 1;
prefs.setInt('counter29', _counter[day]);
_score=_counter[day];
}
if(_day==30){
_loadCounter();
_counter[day] = (prefs.getInt('counter30') ?? 0) + 1;
prefs.setInt('counter30', _counter[day]);
_score=_counter[day];
}
});
}
为了使您的代码更简洁,请先使用 Dart 为您提供的字符串插值。
像这样
setState(() {
if(day > 0 && day <=30) {
_counter[day] = (prefs.getInt('counter$day') ?? 0);
_score=_counter[day];
}
});
如您所见,通过在字符串中使用 $ 符号,您可以将其替换为 day
好了,完成后,您可以进行以下操作。
您不需要在每次要对其执行操作时都获取 SharedPreferences 实例。
我建议您将它存储在一个可以从两个函数访问的变量中。
例如,您可以使用 FutureBuilder:
...
FutureBuilder(
future: () => _getSharedPrefInstance(),
builder: (context, snapshot) {
if(snapshot.hasData){
return YourWidgetHere();
} else {
return CircularProgressIndicator();
}
},
);
...
Future<SharedPreferences> _getSharedPreferences() async {
final instance = await SharedPreferences.getInstance();
setState(() async {
prefs= instance;
});
return instance;
}
...
所以在这里,我们正在做的是利用 FutureBuilder
小部件。这将等待 Future,在等待 Future 完成时它会显示 CircularProgressIndicator
,然后,当 Future 得到解决时,它会显示加载的小部件 YourWidgetHere
.
我们还 await
用于另一个函数中的 SharedPreferences。此函数将等待实例,然后将其保存在变量中,以便您可以从函数中访问它 (_loadDay
& _incrementCounter
).
从这些函数中,您可以调用 prefs.getInt
& prefs.setInt
。
这将提高您的代码速度。
我认为您可以像这样优化 _loadCounter
方法:
_loadCounter() async {
if (_day > 0 && _day < 31) {
final prefs = await SharedPreferences.getInstance();
final value = prefs.getInt('counter$_day') ?? 0;
setState(() {
_counter[day] = value;
_score = value;
});
}
}
你可以做类似于 _incrementCounter
的事情。
我注意到的一件事是你在 day
和 _day
之间做 +1 和 -1;你需要这两个吗?如果不是,您也许可以使用相同的值。作为名称建议,我会使用 dayIndex
而不是 day
.
第二个注意事项,从 SharedPreferences
存储和检索值不是很快。您可能想改用 Hive
包。