@@ -851,12 +851,18 @@ class _ComposeBoxLayout extends StatelessWidget {
851
851
])))); }
852
852
}
853
853
854
+ abstract class ComposeBoxController <T extends StatefulWidget > extends State <T > {
855
+ ComposeTopicController ? get topicController;
856
+ ComposeContentController get contentController;
857
+ FocusNode get contentFocusNode;
858
+ }
859
+
854
860
/// A compose box for use in a stream narrow.
855
861
///
856
862
/// This offers a text input for the topic to send to,
857
863
/// in addition to a text input for the message content.
858
864
class _StreamComposeBox extends StatefulWidget {
859
- const _StreamComposeBox ({required this .narrow});
865
+ const _StreamComposeBox ({super .key, required this .narrow});
860
866
861
867
/// The narrow on view in the message list.
862
868
final StreamNarrow narrow;
@@ -865,9 +871,14 @@ class _StreamComposeBox extends StatefulWidget {
865
871
State <_StreamComposeBox > createState () => _StreamComposeBoxState ();
866
872
}
867
873
868
- class _StreamComposeBoxState extends State <_StreamComposeBox > {
874
+ class _StreamComposeBoxState extends State <_StreamComposeBox > implements ComposeBoxController <_StreamComposeBox > {
875
+ @override ComposeTopicController get topicController => _topicController;
869
876
final _topicController = ComposeTopicController ();
877
+
878
+ @override ComposeContentController get contentController => _contentController;
870
879
final _contentController = ComposeContentController ();
880
+
881
+ @override FocusNode get contentFocusNode => _contentFocusNode;
871
882
final _contentFocusNode = FocusNode ();
872
883
873
884
@override
@@ -906,16 +917,21 @@ class _StreamComposeBoxState extends State<_StreamComposeBox> {
906
917
}
907
918
908
919
class _FixedDestinationComposeBox extends StatefulWidget {
909
- const _FixedDestinationComposeBox ({required this .narrow});
920
+ const _FixedDestinationComposeBox ({super .key, required this .narrow});
910
921
911
922
final SendableNarrow narrow;
912
923
913
924
@override
914
925
State <_FixedDestinationComposeBox > createState () => _FixedDestinationComposeBoxState ();
915
926
}
916
927
917
- class _FixedDestinationComposeBoxState extends State <_FixedDestinationComposeBox > {
928
+ class _FixedDestinationComposeBoxState extends State <_FixedDestinationComposeBox > implements ComposeBoxController <_FixedDestinationComposeBox > {
929
+ @override ComposeTopicController ? get topicController => null ;
930
+
931
+ @override ComposeContentController get contentController => _contentController;
918
932
final _contentController = ComposeContentController ();
933
+
934
+ @override FocusNode get contentFocusNode => _contentFocusNode;
919
935
final _contentFocusNode = FocusNode ();
920
936
921
937
@override
@@ -945,19 +961,20 @@ class _FixedDestinationComposeBoxState extends State<_FixedDestinationComposeBox
945
961
}
946
962
947
963
class ComposeBox extends StatelessWidget {
948
- const ComposeBox ({super .key, required this .narrow});
964
+ const ComposeBox ({super .key, this .controllerKey, required this .narrow});
949
965
966
+ final GlobalKey <ComposeBoxController >? controllerKey;
950
967
final Narrow narrow;
951
968
952
969
@override
953
970
Widget build (BuildContext context) {
954
971
final narrow = this .narrow;
955
972
if (narrow is StreamNarrow ) {
956
- return _StreamComposeBox (narrow: narrow);
973
+ return _StreamComposeBox (key : controllerKey, narrow: narrow);
957
974
} else if (narrow is TopicNarrow ) {
958
- return _FixedDestinationComposeBox (narrow: narrow);
975
+ return _FixedDestinationComposeBox (key : controllerKey, narrow: narrow);
959
976
} else if (narrow is DmNarrow ) {
960
- return _FixedDestinationComposeBox (narrow: narrow);
977
+ return _FixedDestinationComposeBox (key : controllerKey, narrow: narrow);
961
978
} else if (narrow is AllMessagesNarrow ) {
962
979
return const SizedBox .shrink ();
963
980
} else {
0 commit comments