Flutter Future<QuerySnapshot> 为空
Flutter Future<QuerySnapshot> empty
大家好,感谢大家抽出宝贵时间。
作为这里的新成员,我恳请不要对我和我的担忧太苛刻,如果我违反了我此刻不知道的任何规则。
情况:我得到了 flutter 代码来增强功能。预先存在的代码正在从 firestore 数据库中获取数据。我被要求增强代码以添加用户管理(管理功能)。所有参与人员都是flutter新手所以所有代码基本上都是根据网上的例子完成的。
问题:
到目前为止还好,但是只要我在查询快照上调用未来函数,我就不会得到任何用户数据。我尝试了不同的方法,但 none 确实有效(例如,通过 for 循环遍历快照、添加 Firestore 索引器、添加规则等)
在下文中,我将向您介绍 firestore 结构以及检索数据并发送到列表视图构建器的最新尝试:
FireStore
这是代码:
final _auth = FirebaseAuth.instance;
CollectionReference _collectionRef =
FirebaseFirestore.instance.collection('users');
class _UserlistScreenState extends State<UserlistScreen> {
final currentUser = _auth.currentUser.email;
@override
void initState() {
getUserList();
print(traceCount++);
super.initState();
}
var traceCount = 0;
var snapshotData;
var itemCount;
var userList;
Future<QuerySnapshot> getUserList() async {
return userList = await _collectionRef
.doc('settings')
.collection('userSettings')
//.where('cid', isEqualTo: globals.CID)
.get();
}
/*Function Cycle() {
for (var doc in userList.docs) {
print(doc.data);
}
}*/
@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
appBar: AppBar(
title: Hero(
tag: 'logo',
child: Image.asset(
'assets/rgb.png',
height: MediaQuery.of(context).size.height * 0.05,
fit: BoxFit.cover,
),
),
actions: [],
centerTitle: true,
elevation: 4,
),
body: BackgroundContainer(
child: Column(
children: [
Expanded(
child: FutureBuilder(
future: getUserList(),
builder:
(BuildContext context, AsyncSnapshot querySnapshot) {
if (querySnapshot.hasData) {
print(userList.docs); // test
/*return ListView(children: getUser(querySnapshot));*/ // also test
return ListView.builder(
itemCount: userList.docs.length,
itemBuilder: (BuildContext context, index) {
var xname = userList.docs[index]['name'].toString();
var xemail = userList.docs[index]['email'].toString();
final List<Map> _tableData = [
{'id': 'Name:', 'content': xname},
{'id': 'Email:', 'content': xemail},
];
return ListTile(
enabled: true,
selected: false,
tileColor: Colors.black,
leading: Icon(Icons.person),
title: Text('Name'),
subtitle: Text('Email'),
/*title: Text("Name: " +
// userList.data.docs[index].get('name')),
userList.data.docs[index]['name'].toString()),
subtitle: Text("Email: " +
userList.data.docs[index].get('email')),
// userList.data.docs[index]['email'].toString()),*/
onTap: () {
showModalBottomSheet(
context: context,
builder: (context) => Container(
height: 500,
child: Padding(
padding: const EdgeInsets.all(20.0),
child: Table(
border: TableBorder(
horizontalInside:
BorderSide(width: 1)),
children: _tableData.map((data) {
return TableRow(
children: [
Container(
padding: EdgeInsets.all(8.0),
child: Text(data['id']),
),
Container(
padding: EdgeInsets.all(8.0),
child: Text(data['content']),
),
],
);
}).toList(),
),
),
),
);
},
);
},
);
} else {
return Center(
child: CircularProgressIndicator(),
);
}
}),
),
],
),
),
),
);
}
}
Firestore 规则:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth != null;
}
}
}
FireStore 索引
enter image description here
我觉得代码盲,找不到我所依赖的基本错误。非常感谢帮助。
亲切的问候
您的 settings
字段是集合而不是文档,
所以你代码中的这两行是指你想要的数据:
.doc('settings')
.collection('userSettings')
它们应该是相反的,比如:
Future<DocumentSnapshot> getUserList() async {
return userList = await FirebaseFirestore.instance
.doc('users/a@a.de/settings/userSettings')
.get();
}
之前的代码会 return 文档“userSettings”
大家好,感谢大家抽出宝贵时间。 作为这里的新成员,我恳请不要对我和我的担忧太苛刻,如果我违反了我此刻不知道的任何规则。
情况:我得到了 flutter 代码来增强功能。预先存在的代码正在从 firestore 数据库中获取数据。我被要求增强代码以添加用户管理(管理功能)。所有参与人员都是flutter新手所以所有代码基本上都是根据网上的例子完成的。
问题: 到目前为止还好,但是只要我在查询快照上调用未来函数,我就不会得到任何用户数据。我尝试了不同的方法,但 none 确实有效(例如,通过 for 循环遍历快照、添加 Firestore 索引器、添加规则等)
在下文中,我将向您介绍 firestore 结构以及检索数据并发送到列表视图构建器的最新尝试:
FireStore
这是代码:
final _auth = FirebaseAuth.instance;
CollectionReference _collectionRef =
FirebaseFirestore.instance.collection('users');
class _UserlistScreenState extends State<UserlistScreen> {
final currentUser = _auth.currentUser.email;
@override
void initState() {
getUserList();
print(traceCount++);
super.initState();
}
var traceCount = 0;
var snapshotData;
var itemCount;
var userList;
Future<QuerySnapshot> getUserList() async {
return userList = await _collectionRef
.doc('settings')
.collection('userSettings')
//.where('cid', isEqualTo: globals.CID)
.get();
}
/*Function Cycle() {
for (var doc in userList.docs) {
print(doc.data);
}
}*/
@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
appBar: AppBar(
title: Hero(
tag: 'logo',
child: Image.asset(
'assets/rgb.png',
height: MediaQuery.of(context).size.height * 0.05,
fit: BoxFit.cover,
),
),
actions: [],
centerTitle: true,
elevation: 4,
),
body: BackgroundContainer(
child: Column(
children: [
Expanded(
child: FutureBuilder(
future: getUserList(),
builder:
(BuildContext context, AsyncSnapshot querySnapshot) {
if (querySnapshot.hasData) {
print(userList.docs); // test
/*return ListView(children: getUser(querySnapshot));*/ // also test
return ListView.builder(
itemCount: userList.docs.length,
itemBuilder: (BuildContext context, index) {
var xname = userList.docs[index]['name'].toString();
var xemail = userList.docs[index]['email'].toString();
final List<Map> _tableData = [
{'id': 'Name:', 'content': xname},
{'id': 'Email:', 'content': xemail},
];
return ListTile(
enabled: true,
selected: false,
tileColor: Colors.black,
leading: Icon(Icons.person),
title: Text('Name'),
subtitle: Text('Email'),
/*title: Text("Name: " +
// userList.data.docs[index].get('name')),
userList.data.docs[index]['name'].toString()),
subtitle: Text("Email: " +
userList.data.docs[index].get('email')),
// userList.data.docs[index]['email'].toString()),*/
onTap: () {
showModalBottomSheet(
context: context,
builder: (context) => Container(
height: 500,
child: Padding(
padding: const EdgeInsets.all(20.0),
child: Table(
border: TableBorder(
horizontalInside:
BorderSide(width: 1)),
children: _tableData.map((data) {
return TableRow(
children: [
Container(
padding: EdgeInsets.all(8.0),
child: Text(data['id']),
),
Container(
padding: EdgeInsets.all(8.0),
child: Text(data['content']),
),
],
);
}).toList(),
),
),
),
);
},
);
},
);
} else {
return Center(
child: CircularProgressIndicator(),
);
}
}),
),
],
),
),
),
);
}
}
Firestore 规则:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth != null;
}
}
}
FireStore 索引 enter image description here
我觉得代码盲,找不到我所依赖的基本错误。非常感谢帮助。
亲切的问候
您的 settings
字段是集合而不是文档,
所以你代码中的这两行是指你想要的数据:
.doc('settings')
.collection('userSettings')
它们应该是相反的,比如:
Future<DocumentSnapshot> getUserList() async {
return userList = await FirebaseFirestore.instance
.doc('users/a@a.de/settings/userSettings')
.get();
}
之前的代码会 return 文档“userSettings”