【问题标题】:How to optimize this Flutter code so it does less work?如何优化此 Flutter 代码以减少工作量?
【发布时间】:2021-03-19 04:33:55
【问题描述】:

我的应用程序做的工作太多。如何优化此代码?我不知道如何改变它,仍然得到同样的效果! 我需要将每个变量都保存在手机上,这样我就可以随时回到那个状态。

我试图将每天的分数保存在自己的变量中,因为我不知道如何以不同的方式返回它。

如你所见,我是初学者。

代码:

_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];
      }
    });
  }

【问题讨论】:

  • 循环,通过字符串插值创建首选项名称,完成了吗?
  • 如果您有工作代码希望同行评审以进行改进,您应该在专门为此目的创建的Code Review 上提问。
  • @KenWhite 好的,谢谢,我去那里试试!

标签: android flutter dart refactoring counter


【解决方案1】:

我认为您可以像这样优化_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 包。

【讨论】:

  • 非常感谢!它适用于 _loadCounter 部分!我觉得我自己用增量计数器尝试它有点搞砸了。我必须使用日期变量,因为我在屏幕上显示日期。如果我使用相同的变量,显示日期将从 0 开始想...
【解决方案2】:

利用 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

我们还在另一个函数中为 SharedPreferences await。此函数将等待实例,然后将其保存在变量中,以便您可以从函数中访问它(_loadDay & _incrementCounter)。

然后,您可以从这些函数中调用prefs.getIntprefs.setInt

这将提高您的代码速度。

【讨论】:

  • 它没有用..它节省了正确的金额但是当我切换页面并返回主计数器时它显示'0'直到我增加一天并将它减少到那天......而不是它显示正确的数字..
猜你喜欢
  • 2019-12-14
  • 2018-03-30
  • 1970-01-01
  • 2017-04-19
  • 2017-01-25
  • 1970-01-01
  • 2022-01-22
  • 2011-04-09
  • 1970-01-01
相关资源
最近更新 更多