如何更高效地编写这个 Flutter 代码?

Posted

技术标签:

【中文标题】如何更高效地编写这个 Flutter 代码?【英文标题】:How to write this Flutter code more efficiently? 【发布时间】:2020-01-18 07:41:47 【问题描述】:

正如您在第一部分中看到的,我正在检查某个值是否包含在来自 Firestore 的文档中并返回一个布尔值。现在我在构建中调用该函数,并根据该返回值更改芯片颜色(第二部分)。

现在的问题可能是因为我在构建函数中调用它,所以它在构建过程中被连续调用,这让我在 Firestore 中读取了大量数据,或者该函数效率低下。我怎样才能更有效地写这个?

checkAtt(String name, id , date) async
   var ref = _db.collection('subjects').document(id).collection('Att').document(date);
   var docref = await ref.get();
      return docref.data.containsKey(name)
        ?true
        :false;
  

 class PresentChip extends StatefulWidget 
  final candidate;
  PresentChip(
    this.candidate, 
    Key key,
  ) : super(key: key);
  @override
  _PresentChipState createState() => _PresentChipState();


class _PresentChipState extends State<PresentChip> 
  var isSelected = false;
  var c = false;
  @override
  Widget build(BuildContext context) 
    final SelectSub selectSub = Provider.of<SelectSub>(context);
    final Date date = Provider.of<Date>(context);

  db.checkAtt(widget.candidate, selectSub.selectsub, date.datenew).then((result)
    print(result);
    setState(() 
     c = result; 
    );
  ); 

       return Container(
      child: ChoiceChip(
        label: Text('Present'),
        selected: isSelected,
        onSelected: (selected) 
          db.gibAtt(
              widget.candidate, selectSub.selectsub, date.datenew.toString());
          setState(() 
            isSelected = selected;
          );
        ,
        backgroundColor: !c ?Colors.red :Colors.green ,
        selectedColor: !c ?Colors.red :Colors.green ,
    ));
  


【问题讨论】:

您应该在问题中发布图片,而不是在问题的 cmets 中 @Durdu 这样吗? 你应该直接添加代码,而不是图像。 @Durdu 好的....已编辑 我已经编辑了这个问题。以前它被表述为“任何人都愿意做一些免费的工作”,我现在已经改变了它,所以重点是你,这个帖子的作者,如何能够达到预期的结果。差异可能是微妙的,但它可以解释四次投反对票。 【参考方案1】:

假设您只想从 firestore 读取一次,您需要一个 FutureBuilder。

return Container(
  child: FutureBuilder(
    future: db.checkAtt(widget.candidate, selectSub.selectsub, date.datenew),
    builder: (context, snapshot) 
      if(snapshot.hasData)
      return ChoiceChip(
        ...
        backgroundColor: !snapshot.data ?Colors.red :Colors.green,
        selectedColor: !snapshot.data ?Colors.red :Colors.green,
      );

      //Return another widget if the future has no data
      return Text('Future has no data');
    
  )
);

如果您需要您的 UI 对来自 Firestore 的更改做出反应,请使用 StreamBuilder。

您可以从构建方法中删除以下块:

db.checkAtt(widget.candidate, selectSub.selectsub, date.datenew).then((result)
  print(result);
  setState(() 
   c = result; 
  );
);

【讨论】:

以上是关于如何更高效地编写这个 Flutter 代码?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用make更高效地编译c文件

Flutter入门Dart语言:操作符的基本用法

如何在 C# 中高效地编写大型文本文件?

只要状态没有被授予,如何一直询问位置权限-Flutter

如何使用 Ansible 官方模块更高效地向 VMware VM 主机添加磁盘?

如何在 C++ 中编写高效的遗传算法