如何使用 StreamBuilder 更新 TextField 的值?

Nud*_*dge 12 textfield dart flutter rxdart sqflite

我有一个textfield,我sqflite在我的应用程序中使用数据库。该sqflite有,我需要分配给我的价值textfield

这是我的textfield代码

 StreamBuilder<String>(
    stream: patientHealthFormBloc.doctorName,
    builder: (context, snapshot) {
      return TextFormField(
        initialValue: patientHealthFormBloc.doctorNameValue,
        onChanged: (value) {
          patientHealthFormBloc.doctorNameChanged(value);
        },
        ...
Run Code Online (Sandbox Code Playgroud)

现在在initstate我的类的方法中,我从数据库中获取值。这是一个异步操作,所以需要时间。

我的 bloc 类有如下代码

Function(String) get doctorNameChanged => _doctorName.sink.add;
Run Code Online (Sandbox Code Playgroud)

因此,一旦我从数据库中收到值,我就会调用以下方法

doctorNameChanged("valuefromdatabase");
Run Code Online (Sandbox Code Playgroud)

但我看不到文本字段中的值。我的数据库中还有一个值。是否可以在不使用TextEditingController或的情况下更新值setState。我是个试图避免那些因为我的课是很多chuncks和方式过于复杂,使用任何上述我一直在使用与同样的方法试了划分RadioButton,并CheckBox和他们似乎正确更新。该值也会更新, _doctorName.stream.value其中存在于数据库中但textfield不显示任何数据。我也尝试改变颜色,textfield所以那里没有问题,而且我能够看到我输入的内容。

我做了一个应用程序的小演示https://github.com/PritishSawant/demo/tree/master/lib

sqflite我正在使用shared preferences而不是使用,但问题仍然存在

Nud*_*dge 4

好的,我终于找到了解决我的问题的方法。

以下是我的代码,我刚刚使用SharedPreferences而不是sqflite下面的示例。同样的事情可以用sqflite

class _MyHomePageState extends State<MyHomePage> {

  MyBloc myBloc = MyBloc();
  TextEditingController myController = TextEditingController();

  @override
  void dispose() {
    myBloc?.close();
    myController?.dispose();
    super.dispose();
  }

  @override
  void initState() {
    super.initState();
    AppPreferences.setString("data", "this is my data");
    AppPreferences.getString("data").then((value){
      myBloc.dataChanged(value);
    });
  }


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: StreamBuilder(
          stream: myBloc.data,
           builder: (context,snapshot){

            debugPrint(snapshot.data);
            myController.value = myController.value.copyWith(text: myBloc.dataValue);

            return TextFormField(
              controller: myController,
              onChanged: (value){
                myBloc.dataChanged(value);
              },
            );
           },
        ),
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个极其过度设计的解决方案。我希望您已经解释了您最初想要实现的目标,而不是希望我们修复您的特定解决方案。正如我对您的问题发表评论时,您似乎想要对用户可能正在积极使用的文本字段进行实时更新。这是非常奇怪的,而且可能是糟糕的用户体验。 (2认同)