[英]Why am I getting a Bad state error in this case?
I updated all my packages to the latest version and now I'm getting this error: Bad state: field does not exist within the DocumentSnapshotPlatform
when fetching some data.我将我的所有包更新到最新版本,现在我收到此错误:
Bad state: field does not exist within the DocumentSnapshotPlatform
。
I found some issues related to the same problem here but none solved my problem, most of them were related to changes on how DocumentSnapshot works and I probably must have missed something from the documentation that is causing this error.我在这里发现了一些与同一问题相关的问题,但都没有解决我的问题,其中大部分与 DocumentSnapshot 工作方式的更改有关,我可能一定是错过了导致此错误的文档中的某些内容。
Well, I'll put below where I think the problem is and the complete code.好吧,我会把我认为问题所在的地方和完整的代码放在下面。
List<UserResult> searchResults = [];
snapshot.data.docs.forEach((doc) {
Users user = Users.fromDocument(doc);
UserResult searchResult = UserResult(user);
searchResults.add(searchResult);
});
1: 1:
List<UserResult> searchResults = [];
snapshot.data().docs.forEach((doc) {
Users user = Users.fromDocument(doc);
UserResult searchResult = UserResult(user);
searchResults.add(searchResult);
});
2: 2:
List<UserResult> searchResults = [];
var item = snapshot.data();
item.docs.forEach((doc) {
Users user = Users.fromDocument(doc);
UserResult searchResult = UserResult(user);
searchResults.add(searchResult);
});
class _SearchState extends State<Search> {
TextEditingController searchController = TextEditingController();
Future<QuerySnapshot> searchResultsFuture;
handleSearch(String query) {
Future<QuerySnapshot> results =
usersRef.where("tag", isEqualTo: query).get();
setState(() {
searchResultsFuture = results;
});
}
buildResults() {
return FutureBuilder(
future: searchResultsFuture,
builder: (context, snapshot) {
if (snapshot.connectionState != ConnectionState.done) {
return SizedBox(
child: CircularProgressIndicator(),
);
}
List<UserResult> searchResults = [];
snapshot.data.docs.forEach((doc) {
Users user = Users.fromDocument(doc);
UserResult searchResult = UserResult(user);
searchResults.add(searchResult);
});
return SingleChildScrollView(
child: Column(
children: searchResults,
),
);
},
);
}
buildNoContent() {
return Container();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
child: SingleChildScrollView(
child: Column(
children: <Widget>[
Center(
child: Text(
"Type something",
),
),
TextFormField(
enableInteractiveSelection: true,
controller: searchController,
keyboardType: TextInputType.text,
onFieldSubmitted: handleSearch(searchController.text),
),
searchResultsFuture == null
? buildNoContent()
: buildResults(),
],
),
),
),
);
}
}
import 'package:cloud_firestore/cloud_firestore.dart';
class Users {
String id;
String email;
String tag;
Users(
{this.id,
this.email,
this.tag});
factory Users.fromDocument(DocumentSnapshot doc) {
return Users(
id: doc.id,
email: doc['email'],
tag: doc['tag']);
}
}
Change改变
FutureBuilder(
To到
FutureBuilder<QuerySnapshot>(
And in your factory method, do the this:在您的工厂方法中,执行以下操作:
factory Users.fromDocument(DocumentSnapshot doc) {
return Users(
id: doc.id,
email: doc.data()['email'],
tag: doc.data()['tag']);
}
After trying a ton of combinations, this worked:在尝试了大量的组合之后,这奏效了:
import 'package:cloud_firestore/cloud_firestore.dart';
class Users {
String id;
String email;
String tag;
Users(
{this.id,
this.email,
this.tag});
factory Users.fromDocument(DocumentSnapshot<Map<String, dynamic>> doc) {
return Users(
id: doc.id,
email: doc.data()['email'],
tag: doc.data()['tag']);
}
}
class _SearchState extends State<Search> {
TextEditingController searchController = TextEditingController();
Future<QuerySnapshot<Map<String, dynamic>>> searchResultsFuture;
handleSearch(String query) {
Future<QuerySnapshot> results =
usersRef.where("tag", isEqualTo: query).get();
setState(() {
searchResultsFuture = results;
});
}
buildResults() {
return FutureBuilder<QuerySnapshot<Map<String, dynamic>>>(
future: searchResultsFuture,
builder: (context, snapshot) {
if (snapshot.connectionState != ConnectionState.done) {
return SizedBox(
child: CircularProgressIndicator(),
);
}
List<UserResult> searchResults = [];
snapshot.data.docs.forEach((doc) {
Users user = Users.fromDocument(doc);
UserResult searchResult = UserResult(user);
searchResults.add(searchResult);
});
return SingleChildScrollView(
child: Column(
children: searchResults,
),
);
},
);
}
Basically I just added the <Map<String, dynamic>>基本上我只是添加了 <Map<String, dynamic>>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.