如何将 Flutter TextField 与 Firestore 字段同步?

Ale*_*sky 2 firebase flutter google-cloud-firestore

task在具有todo字段的Firestore和TextFieldFlutter UI 中有文档。

请建议如何使textfieldtodo字段同步,即

  1. 任何时候, 中的文本textfield随着用户的输入而改变,todo用刚刚输入的值更新字段。
  2. 任何时候,该todo字段都会更新(在 Firestore 控制台中手动或由其他用户),textfield使用最新值更新。

谢谢!

小智 5

首先,提供一个TextEditingControllerTextField(看一下这个完整的例子)。

对于这个问题的第一部分,你将需要提供listenerTextEditingController。这listener应该触发这样的功能:

  Future<void> _updateTaskValue(String text) {
    Firestore().runTransaction((Transaction transaction) {
      Firestore.instance.document([PATH OF YOUR DOCUMENT]).updateData({"todo": text});
    });
  }
Run Code Online (Sandbox Code Playgroud)

假设这text是控制器的text值。请注意,runTransaction用于避免数据并发。

对于问题的第二部分,您将不得不听文件。要做到这一点,声明为initState一个StreamSubscription

subscription = Firestore.instance.document("").snapshots().listen(
    (DocumentSnapshot snapshot) => this._onDatabaseUpdate(snapshot));
Run Code Online (Sandbox Code Playgroud)

每次更新内容时,此订阅都会触发一个功能(无论是当前用户更新TextField、其他用户更新,还是从后台手动更新)。

下面调用的函数只是text用新内容更新控制器的属性:

void _onDatabaseUpdate(DocumentSnapshot snapshot) {
  setState(() {
    _controller.text = snapshot.data["todo"];
  });
}
Run Code Online (Sandbox Code Playgroud)

有关完整示例,请参阅此要点