我正在设计一个应用程序来调查当前事务的用户。我想要一个特定的图标出现基于用户是否已经采取了当前的事务调查。
目前,我有一个未来,它将从Firestore中提取当前调查的名称,然后检查集合_entrants中是否存在文档。如果用户已经进行了调查,它将存储在一个文档中,文档名为他们的用户名(这是从Firebase身份验证获得的)。
如果是这样的话,图标应该是一个滴答图标,因为用户已经接受了调查。如果他们没有接受调查,文档将不存在,用户将看到另一个图标(如' new‘图标),以显示有一个新的调查。
我使用了以下代码来获取用户是否进行了调查的信息:
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(() {});}
然后这里将显示图标:
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不断重建页面的设置。
谢谢。抱歉,如果不清楚的话。我对编码很陌生。
发布于 2020-06-06 17:38:26
嘿,解决方案是一个简单的流生成器。
流生成器将更改它返回的内容,而不使用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),
);
}
},
);
}
},
);发布于 2020-06-06 17:27:49
如果您想在小部件树中重新加载一个特定的小部件而不重新构建脚手架,那么我建议在提供者更新时,将ChangeNotifierProvider与仅应用于您要重新加载的小部件的使用者结合使用。
参考资料:https://medium.com/flutterpub/provider-state-management-in-flutter-d453e73537c5
https://stackoverflow.com/questions/62235210
复制相似问题