首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flutter:基于中是否存在文档更新图标小部件

Flutter:基于中是否存在文档更新图标小部件
EN

Stack Overflow用户
提问于 2020-06-06 17:09:43
回答 2查看 436关注 0票数 0

我正在设计一个应用程序来调查当前事务的用户。我想要一个特定的图标出现基于用户是否已经采取了当前的事务调查。

目前,我有一个未来,它将从Firestore中提取当前调查的名称,然后检查集合_entrants中是否存在文档。如果用户已经进行了调查,它将存储在一个文档中,文档名为他们的用户名(这是从Firebase身份验证获得的)。

如果是这样的话,图标应该是一个滴答图标,因为用户已经接受了调查。如果他们没有接受调查,文档将不存在,用户将看到另一个图标(如' new‘图标),以显示有一个新的调查。

我使用了以下代码来获取用户是否进行了调查的信息:

代码语言:javascript
复制
Future<void> takenSurvey2() async {
final sn = await Firestore.instance
    .collection('Controller')
    .document('Current Survey')
    .get();
surveyName = sn['cs'];
  //The above gives me the name of the current survey
final snapShot = await Firestore.instance
    .collection('$surveyName' + '_entrants')
    .document(userid)
    .get();
if (snapShot.exists) {
  takenSurvey = true;
} else {
  takenSurvey = false;
}
setState(() {});

}

然后这里将显示图标:

代码语言:javascript
复制
Positioned(
  right: 30,
  top: 20,
  child: FutureBuilder(
    future: takenSurvey2(),
    builder: (context, snapshot) {
      if (takenSurvey == false) {
        return Icon(
          Foundation.burst_new,
          size: 48,
          color: Color(0xff303841),
        );
      } else if (takenSurvey == true) {
        return Icon(
          Foundation.check,
          size: 48,
          color: Color(0xff303841),
        );
      } else
        return Container();
    })),

目前,这一切都很好。**然而,当我添加一个AdMob广告时,广告没有机会加载,因为takenSurvey2中的setState(() {})似乎在不断地重建应用程序,我只看到一个闪烁的方框。

我如何才能从current获得更新,了解用户是否接受了调查,以及如果值发生了变化(例如,他们接受了调查,或者我更改了当前的调查),页面将被重建或图标更改,而不是我当前设置的用setstate不断重建页面的设置。

谢谢。抱歉,如果不清楚的话。我对编码很陌生。

EN

回答 2

Stack Overflow用户

发布于 2020-06-06 17:38:26

嘿,解决方案是一个简单的流生成器。

流生成器将更改它返回的内容,而不使用setstate。无论何时,Firebase中的当前调查文件都会有变化

代码语言:javascript
复制
StreamBuilder(
  stream: Firestore.instance
      .collection('Controller')
      .document('Current Survey')
      .get(),
  builder: (context, snapshot) {
    if (!snapshot.hasData) {
      print('Loading');
      //you can put a loadin widget here
    } else {
      var sn = snapshot.data;
      var surveyName = sn['cs'];
      return StreamBuilder(
        stream: Firestore.instance
            .collection('$surveyName' + '_entrants')
            .document(userid)
            .get(),
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            //this will check if it exists
            return Icon(
              Foundation.check,
              size: 48,
              color: Color(0xff303841),
            );
          } else {
            return Icon(
              Foundation.burst_new,
              size: 48,
              color: Color(0xff303841),
            );
          }
        },
      );
    }
  },
);
票数 1
EN

Stack Overflow用户

发布于 2020-06-06 17:27:49

如果您想在小部件树中重新加载一个特定的小部件而不重新构建脚手架,那么我建议在提供者更新时,将ChangeNotifierProvider与仅应用于您要重新加载的小部件的使用者结合使用。

参考资料:https://medium.com/flutterpub/provider-state-management-in-flutter-d453e73537c5

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62235210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档