如何优化此 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 包。