android - 颤振列表没有得到所有的价值
问题描述
我有一个 FutureBuilder(非常适合加载)从 Firebase 获取我的 DocumentSnapshot 列表,但问题是如果我推/弹出屏幕,它会一遍又一遍地重建它。为了解决这个问题,我终于把它放在了上面,initState
但我有一个问题,有时我没有从中得到所有的文件。
我有一个按钮来启用国家过滤器和禁用,每次按下它几乎都会立即显示我的文档,例如我总共有 11 个和 5 个已过滤但有时我不会全部得到它们,直到得到我得到应用程序错误的值(长度_userList
?)。我试图放置一个 Future 来强制等待,但我做不到,请指教。
var _userList;
_fetchUserList() {
Future<QuerySnapshot> snapshot;
if (_countryFilter) {
//print('COUNTRY FILTER');
snapshot = Firestore.instance.collection('u').where('country', isEqualTo: country).getDocuments();
} else {
//print('ALL FILTER');
snapshot = Firestore.instance.collection('u').getDocuments();
}
snapshot.then((QuerySnapshot result) {
final List<DocumentSnapshot> documents = result.documents;
if (documents.length > 0) {
final List<DocumentSnapshot> availableUsers =
documents.where((DocumentSnapshot documentSnapshot) => documentSnapshot['userId'] != _id).toList();
//print('userList Size: ' + availableUsers.length.toString());
List<DocumentSnapshot> userShuffle = _shuffle(availableUsers);
setState(() {
_userList = userShuffle;
});
}
});
}
这是我的 GridView:
GridView.builder(
padding: const EdgeInsets.all(10.0),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2, mainAxisSpacing: 10.0, crossAxisSpacing: 10.0, childAspectRatio: 0.85),
itemBuilder: (context, index) {
return _buildItem(context, _userList[index]);
},
itemCount: _userList.length,
)
按钮:
onPressed: () async {
if (_countryFilter) {
_countryFilter = false;
} else {
_countryFilter = true;
}
await _fetchUserList();
setState(() {});
},
解决方案
我已经设法使用一些验证使其工作。不同用户长度的问题也是因为 buildItem 上也使用了“国家”变量。
Future _fetchUserList() async {
setState(() {
_userList = null;
_userLenght = null;
});
QuerySnapshot snapshot;
if (_countryFilter) {
snapshot = await Firestore.instance.collection('u').where('country', isEqualTo: _myCountry).getDocuments();
} else {
snapshot = await Firestore.instance.collection('u').getDocuments();
}
final List<DocumentSnapshot> documents = snapshot.documents;
if (documents.length > 0) {
final List<DocumentSnapshot> availableUsers =
documents.where((DocumentSnapshot documentSnapshot) => documentSnapshot['userId'] != _id).toList();
_userLenght = availableUsers.length;
if (_userLenght > 0) {
List<DocumentSnapshot> userShuffle = _shuffle(availableUsers);
_userList = userShuffle;
}
setState(() {});
}
}
(_userList == null && _userLenght == null)
? Container(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Center(
child: Container(
width: 50.0,
height: 50.0,
alignment: Alignment.center,
child: CircularProgressIndicator(
valueColor: AlwaysStoppedAnimation<Color>(Theme.of(context).primaryColor),
strokeWidth: 2.0,
),
),
),
SizedBox(height: 12.0),
Text(
"We are loading the users",
style: TextStyle(
color: Colors.black54,
fontWeight: FontWeight.bold,
),
textAlign: TextAlign.center,
),
],
),
)
: (_userLenght == 0)
? Container(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Center(
child: Icon(
Icons.supervisor_account,
color: Theme.of(context).primaryColor.withOpacity(0.8),
size: 50.0,
),
),
SizedBox(height: 12.0),
Text(
"No one was found\nTry reloading the screen",
style: TextStyle(
color: Colors.black54,
fontWeight: FontWeight.bold,
),
textAlign: TextAlign.center,
),
],
),
)
: GridView.builder(
padding: const EdgeInsets.all(10.0),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
mainAxisSpacing: 10.0,
crossAxisSpacing: 10.0,
childAspectRatio: 0.85),
itemBuilder: (context, index) {
return _buildItem(context, _userList[index]);
},
itemCount: _userLenght,
),
希望这可以帮助某人。有了这个,我每次推送和弹出屏幕时都能够停止屏幕用户列表随机播放,因为它仅在 initState 和 Button 上。
推荐阅读
- bash - 如何在没有命令行编辑器的情况下打开 .bash_profile?
- r - R:当 fit.measures = T 时,lavaan::sem() 的 summary() 中的错误
- python - 将字典(带有键和值列表)转换为字典列表
- apache-spark - 我可以向处于创建状态的 DataProc 提交作业吗?
- azure-cli - 无法使用 az keyvault secret show 命令从 Azure Key vault Secret 中提取特定值
- javascript - 删除输入后HTML div不会消失
- django - Django reverse_lazy 到具有相关字段 id 的 URL
- flutter - 如何通过 API 调用在颤振应用中播放特定 Youtube 播放列表中的所有视频?
- python - 尝试将多个正则表达式转换为 int 值时引发源错误(“没有重复”)
- django - Django 错误 admin.E202 'stamm.Workplan' 没有 ForeignKey 到 'enquiry.Costing',多对多关系中的内联模型