編集:私はこの回答を掲載以来flutter_flux
の例では、更新されている、それが正しくTextField
ではなく、より良い方法でメッセージを破棄します。あなたはそれをチェックアウトする必要があります。
私は正しい方法ではなく、単にその店でcurrentMessage
を維持する、ChatMessageStore
へTextEditingController
を移動することだと思います。次に、TextEditingController
のclear()
を呼び出して、テキストフィールドを空にすることができます。
通常、バニラフラッターで通常FooState
に保持される状態値はflutter_flux
を使用するとStore
になります。通常はState
にTextEditingController
を作成して保存するので、とにかくStore
に保存するのが自然です。 TextEditingController
がテキスト値の変更自体の世話をするだろうと私たちはもはや、setCurrentMessageAction
が必要
class ChatMessageStore extends Store {
ChatMessageStore() {
triggerOnAction(commitCurrentMessageAction, (ChatUser me) {
final ChatMessage message =
new ChatMessage(sender: me, text: currentMessage);
_messages.add(message);
_msgController.clear();
});
}
final List<ChatMessage> _messages = <ChatMessage>[];
final TextEditingController _msgController = new TextEditingController();
List<ChatMessage> get messages =>
new List<ChatMessage>.unmodifiable(_messages);
TextEditingController get msgController => _msgController;
String get currentMessage => _msgController.text;
bool get isComposing => currentMessage.isNotEmpty;
}
注:
更新ChatMessageStore
は、次のようになります。
ChatScreen
ウィジェットで定義されているmsgController
を削除して、それに応じて_buildTextComposer
を更新することができました。
Widget _buildTextComposer(BuildContext context, ChatMessageStore messageStore,
ChatUserStore userStore) {
final ValueChanged<String> commitMessage = (String _) {
commitCurrentMessageAction(userStore.me);
};
ThemeData themeData = Theme.of(context);
return new Row(children: <Widget>[
new Flexible(
child: new TextField(
key: const Key("msgField"),
controller: messageStore.msgController,
decoration: const InputDecoration(hintText: 'Enter message'),
onSubmitted: commitMessage)),
new Container(
margin: new EdgeInsets.symmetric(horizontal: 4.0),
child: new IconButton(
icon: new Icon(Icons.send),
onPressed:
messageStore.isComposing ?() => commitMessage(null) : null,
color: messageStore.isComposing
? themeData.accentColor
: themeData.disabledColor))
]);
}
希望します。
モデルのビューの実装を保存するのがFluxで悩まされていますが、現在のサンプルコードでは、代替案を許可するという貧弱な仕事をしています。 Flutter State <>オブジェクトにTextEditingControllerを格納する方法を示すサンプルコードを更新しています。私は明日の更新を投稿できるはずです。 –
TextEditingControllerがビューの実装と見なされる理由がわかりません。これは、テキストデータと現在の選択範囲を保持し、何か変更が発生したときにビューに通知します。 Storeに格納するデータモデルのようなものではないでしょうか? – yyoon
TextEditingControllerはビューの実装に関連付けられています。大規模なアプリケーションでは、すべてのウィジェットのすべての入力フィールドに一致させるために何百ものものが必要になるか、または任意に再利用されるそれらのプールが必要になります。これらの作品のどちらもありません。さらに、ビューの存続期間はストアの存続期間とは異なります。 –