flutter - 如果我使用 ConnectionState.waiting,每次我尝试向 TextField 输入一些文本时,屏幕都会自行重建
问题描述
我想使用 Firestore 构建一个具有实时更改的配置文件屏幕。每当配置文件屏幕打开时,我都会在很短的时间内收到此错误:
The following _CastError was thrown building StreamBuilder<DocumentSnapshot>(dirty, dependencies: [_LocalizationsScope-[GlobalKey#f10b3], _InheritedTheme], state: _StreamBuilderBaseState<DocumentSnapshot, AsyncSnapshot<DocumentSnapshot>>#47356):
Null check operator used on a null value
The relevant error-causing widget was:
StreamBuilder<DocumentSnapshot> file:///C:/Users/batuh/AndroidStudioProjects/flutter_appp/lib/screens/profile.dart:40:13
When the exception was thrown, this was the stack:
#0 _ProfileState.build.<anonymous closure> (package:flutter_appp/screens/profile.dart:107:42)
#1 StreamBuilder.build (package:flutter/src/widgets/async.dart:545:81)
#2 _StreamBuilderBaseState.build (package:flutter/src/widgets/async.dart:124:48)
#3 StatefulElement.build (package:flutter/src/widgets/framework.dart:4612:27)
#4 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4495:15)
但在那一刻之后,它得到了数据并且运行良好。我知道我需要使用下面的代码来防止这种情况,就像 Flutter 文档所说的那样。
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(
child: CircularProgressIndicator(),
);
}
但是每当我使用该代码时,每次按下 TextField 时,配置文件页面都会自行重建,因此它不允许我输入任何文本。如果不使用上面的代码,一切正常,我可以在 TextFields 中输入一些文本,并且正在更新用户数据。我不知道该怎么办。我是否错误地使用了流生成器?我应该怎么办?
这是我的 profile.dart 文件中 stful 小部件的脚手架:
Scaffold(
appBar: AppBar(
leading: IconButton(
icon: Icon(FontAwesomeIcons.arrowLeft),
onPressed: () => Navigator.pop(context),
),
actions: [
IconButton(
icon: Icon(FontAwesomeIcons.cog),
onPressed: () => Navigator.pushNamed(context, '/settings'),
)
],
),
body: StreamBuilder<DocumentSnapshot>(
stream: users.doc(FirebaseAuth.instance.currentUser!.uid).snapshots(),
builder:
(BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
if (snapshot.hasError) {
return Text("Something went wrong");
}
return Container(...);
固定版本:
if (snapshot.hasError) {
return Text("Something went wrong");
} else if(snapshot.hasData || snapshot.connectionState == ConnectionState.active) {
return Container(...);
} else {
return Center(
child: CircularProgressIndicator(),
);
}
解决方案
您可以尝试删除“!” 在“数据”上,因为每次触发该“文本字段”时,它都会立即查找数据。“!” 在空安全中意味着它不能是空对象或空事物。尝试先删除它,因为我猜您的 Stream builder 充当了搜索推荐
推荐阅读
- java - MappedSuperclass 扩展另一个 MappedSuperclass
- php - 如何适应 dompdf laravel
- java - 当页面没有响应或查找元素超时时,Selenium 如何提示消息框?
- excel - 根据当前日期计算下一个到期日 - Excel
- corda - Corda shell“未找到匹配的构造函数:”但未指定流构造函数参数
- apache-kafka - Kafka:消息偏移量
- mysql - 从另一个表中排除行
- arrays - ReactJS:调用动作时如何映射数组
- jquery - 使用 Jquery 队列执行 Ajax 调用序列,如果请求失败需要清除队列
- typescript - 运行 mocha 测试时,Typescript 库不可用