首页 > 解决方案 > 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,
              ),
            ]

        ),
        )],
    );
  }
}

标签: fluttertextfieldflutter-layout

解决方案


当您在构建方法中设置值时会出现此问题。如果您想像上面那样设置值,请在类中_UserProfileScreenState维护一个变量_initialized = falsetrue在初始化后创建它。

就像是:

if(!_initialized){
    firstNameController.text = user.firstName;
    _initialized = true;
}

希望这可以帮助!


推荐阅读