flutter - StreamBuilder 中的 TextField 丢失了编辑后的值
问题描述
我正在为一个应用程序开发用户配置文件更新页面,我在那里遇到了问题,要使用我使用过的初始数据填充表单StreamBuilder
并使用TextEditingController
加载数据到TextField
,数据加载正常并且运行良好,但问题是当我尝试更改TextField
并关注下一个TextField
StreamBuilder
使用先前加载并丢失已编辑数据的数据刷新用户界面。在这种情况下,Stream 不会从网络调用中更新。有人遇到过这种情况吗?或任何推荐的方法来做到这一点?请帮忙。
代码
class UserProfileScreen extends StatefulWidget {
@override
_UserProfileScreenState createState() => _UserProfileScreenState();
}
class _UserProfileScreenState extends State<UserProfileScreen> {
UserProfileBloc userBloc;
final firstNameController = TextEditingController();
final surnameNameController = TextEditingController();
final phoneController = TextEditingController();
final emailController = TextEditingController();
var _hashCode = 0;
@override
void initState() {
super.initState();
userBloc = UserProfileBloc();
userBloc.getUser();
}
@override
void dispose() {
userBloc.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
elevation: 0.0,
leading: IconButton(
icon: Icon(
Icons.close,
color: ColorPallet.white,
),
onPressed: () {
if (Navigator.canPop(context)) {
Navigator.pop(context);
}
},
)
),
body: buildUserProfileContent(context),
);
}
Container buildUserProfileContent(BuildContext context) {
return Container(
child: StreamBuilder<UserProfileState>(
stream: userBloc.user,
initialData: UserProfileInitState(),
builder: (context, snapshot) {
if (snapshot.data is UserProfileDataState) {
UserProfileDataState state = snapshot.data;
return buildProfileContent(state.user, state.profileImage);
}
},
),
);
//);
}
ListView buildProfileContent(User user, Uint8List profileImage) {
firstNameController.text = user.firstName;
return ListView(
children: <Widget>[
Container(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
TextField(
controller: firstNameController,
),
]
),
)],
);
}
}
解决方案
当您在构建方法中设置值时会出现此问题。如果您想像上面那样设置值,请在类中_UserProfileScreenState
维护一个变量_initialized = false
并true
在初始化后创建它。
就像是:
if(!_initialized){
firstNameController.text = user.firstName;
_initialized = true;
}
希望这可以帮助!
推荐阅读
- internet-explorer - Nuxt 和 Internet Explorer
- c# - 添加到列表会重复
- excel-formula - 带有变量数组的索引匹配
- ios - 可见单元格的 Swift collectionView 方法未更改
- sql - 根据条件更改列值
- junit4 - Junit 4黄瓜记者跳过测试
- git - 在不提供密码的情况下为不同的人在本地设置 git repo
- python - 为 pdf 文件中的空字段自动添加注释(空表单字段)
- amazon-web-services - CloudFront 速率限制规则不起作用
- r - 更改图例以映射到 R ggplot 2 中的不同变量