3

我在 aTextField的帮助下进行了渲染StreamBuilder,遵循BLoC带有接收器和流的模式。

Widget field(SignUpBloc signUpBloc) {
    return StreamBuilder(
      stream: signUpBloc.outFirstName,
      builder: (context, snapshot) {
        return TextField(
          style: TextStyle(fontSize: 15.0),
          onChanged: signUpBloc.inFirstName,
          decoration: InputDecoration(
            errorStyle: TextStyle(fontSize: 15.0),
            errorText: snapshot.error
          ),
        );
      },
    );
}

我的问题是如何设置初始值?我已尝试使用StreamBuilder'initialData属性,但TextField.

4

2 回答 2

3
TextEditingController _controller = TextEditingController(); // make a controller, 

Widget field(SignUpBloc signUpBloc) {
  return StreamBuilder(
    stream: signUpBloc.outFirstName,
    initialData: YourData, // provide initial data
    builder: (context, snapshot) {
      _controller.value = TextEditingValue(text: "${snapshot.data}"); // assign value to controller this way
      return TextField(
        controller: _controller,
        style: TextStyle(fontSize: 15.0),
        onChanged: signUpBloc.inFirstName,
        decoration: InputDecoration(
            errorStyle: TextStyle(fontSize: 15.0),
            errorText: snapshot.error
        ),
      );
    },
  );
}

编辑:要将光标放在行尾,您可以使用

var cursorPos = _controller.selection;
if (cursorPos.start > _controller.text.length) {
  cursorPos = TextSelection.fromPosition(TextPosition(offset: _controller.text.length));
}
_controller.selection = cursorPos;

资源

于 2019-04-11T18:56:21.657 回答
2

当您需要传递初始值时,您必须有一个 TextEditingController。使用 value.copyWith 策略不需要处理光标,并且为了使小部件更干净,您可以将文本控制器作为参数传递。

// Stream widget
Widget field(SignUpBloc signUpBloc, TextEditingController _txtController) {
    return StreamBuilder(
    stream: signUpBloc.outFirstName,
    builder: (context, snapshot) {
      _txtController.value =
          _txtController.value.copyWith(text: snapshot.data);
      return TextField(
          controller: _txtController,
          onChanged: signUpBloc.inFirstName;
          decoration: InputDecoration(
            errorStyle: TextStyle(fontSize: 15.0),
            errorText: snapshot.error
          ),
    });
}
于 2020-06-05T02:16:12.463 回答