checkBorrowerAlreadyExists()
函数检查用户输入的名称是否已经在firebase数据中存在并返回bool值。我在一个按钮的onPressed
之后的if条件下使用这个函数,我在if条件下提供用户输入作为函数的参数,并根据bool值显示小吃栏。当firebase已经有数据时,这工作得很好,但最初当用户注册并打开应用程序时,firebase将没有任何数据来检查name是否已经存在,屏幕上什么也没有发生。
我使用else条件返回false,如果没有数据,继续在firebase中添加输入,但没有工作。我还尝试以不同的方式使用bool,但没有工作。如何解决这个问题?
checkBorrowerAlreadyExists(String textfieldname) async {
await for (var snapshots in _firestorem
.collection('lender')
.doc(auth.currentUser?.uid)
.collection('borrowers')
.snapshots()) {
for (var message in snapshots.docs) {
bool isThere;
if (message.data().containsValue(textfieldname)) {
return isThere = true;
} else {
return isThere = false;
}
}
}
}
onPressed: () async {
if (borrowerNameController.text.isEmpty) {
Get.snackbar(
'Error:', "Borrower Name can't be empty",
backgroundColor: Colors.red);
} else if (await checkBorrowerAlreadyExists(
borrowerNameController.text)) {
Get.snackbar('Error',
'Borrower Name alread exists, Enter new name',
backgroundColor: Colors.red);
} else{ upload data in firebase}
你不能在build
方法中使用await
,因为没有办法阻止渲染。
解决方案实际上是函数的返回类型,而你离开隐式。如果显式设置返回类型,则为:
Future<bool> checkBorrowerAlreadyExists(String textfieldname) async {
...
因为这返回一个Future
,你需要在你的build
方法中使用FutureBuilder
来呈现布尔值(并决定在该值可用之前要呈现什么)。
比如:
onPressed: () async {
if (borrowerNameController.text.isEmpty) {
Get.snackbar('Error:', "Borrower Name can't be empty", backgroundColor: Colors.red);
}
else {
return FutureBuilder<String>(
future: checkBorrowerAlreadyExists(),
builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
List<Widget> children;
if (snapshot.hasData) {
return Text(borrowerNameController.text)
} else if (snapshot.hasError) {
return Text('Error: ${snapshot.error}'),
} else {
return Text('Awaiting result...'),
}
},
),
我建议查看FutureBuilder
和Flutter的codelab的异步编程文档。