Flutter flatter:根据Cloud Firestore中是否存在文档更新图标小部件

Flutter flatter:根据Cloud Firestore中是否存在文档更新图标小部件,flutter,dart,google-cloud-firestore,Flutter,Dart,Google Cloud Firestore,我正在设计一个应用程序来调查用户对时事的看法。我希望根据用户是否参加过时事调查显示一个特定图标 目前,我有一个未来,从Firestore中提取当前调查的名称,然后检查收集者中是否存在文档。如果用户进行了调查,调查将存储在一个文档中,文档名为其用户id(从Firebase身份验证获得) 如果是,则图标应为勾号图标,因为用户已进行了调查。如果他们没有进行调查,文档将不存在,用户将看到另一个图标(如“新建”图标),以显示有新的调查 我使用了以下代码来获取用户是否进行了调查的信息: Future<

我正在设计一个应用程序来调查用户对时事的看法。我希望根据用户是否参加过时事调查显示一个特定图标

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

如果是,则图标应为勾号图标,因为用户已进行了调查。如果他们没有进行调查,文档将不存在,用户将看到另一个图标(如“新建”图标),以显示有新的调查

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

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(() {});
目前,这一切都很好**但是,当我添加AdMob广告时,广告没有机会加载,因为
takenSurvey2
中的
setState((){})
似乎在不断地重建应用程序,我只看到一个闪烁的框

我如何才能从Cloud Firestore获取关于用户是否进行了调查的更新,以及如果值发生变化(即,他们进行了调查,或我更改了当前调查),则重新生成页面或图标发生变化,而不是使用
setstate
不断重新生成页面的当前设置


多谢各位。对不起,如果不清楚的话。我对编码很陌生

如果您希望在小部件树中重新加载特定的小部件,而不重建支架,那么我建议使用ChangeNotifierProvider和仅应用于要在提供程序更新时重新加载的小部件的使用者


参考资料:

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

流生成器将在不使用setstate的情况下更改返回的内容。。只要Firebase中的当前调查文档发生更改

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),
            );
          }
        },
      );
    }
  },
);

非常感谢。我将它插入到我的代码中(在定位的小部件下,对吗?),tt返回一个错误-
错误:参数类型“Future”无法分配给参数类型“Stream”。
我这样做对吗?很好-我是否替换了“Future takenSurvey2()”或“child:FutureBuilder”(“?我已经替换了后者并删除了将来的void。替换你键入的所有内容。你的整个代码替换为我的。尝试一下。你可以稍后调整外观,但现在替换整个内容。streams的工作方式是始终获取最新值,并使用这些值确定它显示的内容。我有一个问题,广告是否被删除了?”从admob加载到你的应用程序..你收到实际的广告了吗.因为我上次检查时我的广告不起作用了我正在使用测试广告,而我正在设置所有设置-听到了太多关于admob过分热衷于惩罚虚假点击的人的恐怖故事.yh听到了这些..好的,谢谢
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),
            );
          }
        },
      );
    }
  },
);