颤振更新文本小部件变量而无需重新加载

Posted

技术标签:

【中文标题】颤振更新文本小部件变量而无需重新加载【英文标题】:Flutter Update Text Widget Variable without Reloading 【发布时间】:2021-10-26 03:51:51 【问题描述】:

我正在使用 Flutter 和 Firestore 来制作投资应用程序。 enter image description here 在这个页面中,我在 Streambuilder 中获取了 Firestore 的数据。 我收到的数据用 Inkwell 显示在 Listview 中。 我想要做的是当我单击 Inkwell 时,然后将左下角的 Text Widget 的文本更改为 Listview 的编号。 所以,我在 FutureBuilder 中使用了 setstate 方法。 它有效,但存在一些问题。 当我单击 Inkwell 时,整个页面都会重新加载。 因此,我的 Streambuilder 小部件显示 circleprogressindicator 短。 但是我认为这对用户不利。 我想解决这个问题。 有什么解决办法吗? 我的代码在这里。 我很抱歉我的英语不好,我希望我的问题得到了适当的沟通。 https://github.com/RGLie/Investing-Game-ICISTS/blob/main/lib/startup_1_trade.dart

【问题讨论】:

不是左下角,右下角的文字! 我认为这是因为您在彼此之间嵌套了太多StreamBuildersetState 巧妙地忽略了不变的部分,因此不会重新渲染它们。在您的情况下,有许多 StreamBuilder 小部件,因此您可以尝试将它们全部包装在一个内 【参考方案1】:

您可以通过将流存储在build 方法之外的变量中并在StreamBuilder 小部件中使用它们来修复重建。

class Startup1Trade extends StatefulWidget 
  ...


class _Startup1TradeState extends State<Startup1Trade> 
  ...

  CollectionReference prices = FirebaseFirestore.instance.collection('startup_1');
  CollectionReference users = FirebaseFirestore.instance.collection('users');

  final Stream priceStream = prices.doc('price').snapshots();
  final Stream userStream = users.doc(widget.user.uid).snapshots();
  
  @override
  Widget build(BuildContext context) 
    ...
  
  


像这样使用它们:

StreamBuilder<DocumentSnapshot>(
  stream: priceStream,
  builder: (context, snap) 
    ...
  


StreamBuilder<DocumentSnapshot>(
  stream: userStream,
  builder: (context, snap) 
    ...
  

【讨论】:

以上是关于颤振更新文本小部件变量而无需重新加载的主要内容,如果未能解决你的问题,请参考以下文章

如何正确删除小部件并更新/重新加载小部件

如何在无需重新定义整个表单的情况下使用带有通用 UpdateView 的自定义小部件?

Qt - 重新加载小部件内容

在调试模式下在颤振上显示特定的小部件

颤振文本小部件不出现

颤振小部件不显示