Skip to content

Commit 85ebff1

Browse files
committed
compose [nfc]: Pass PageRoot.contextOf to _Banner.buildTrailing
See added dartdoc for motivation. I don't think there's a behavior change here; we don't use the passed BuildContext after an async gap. We'd like to do that soon, though: to show an error dialog on API errors from the edit-message request; such errors will arrive after the banner has disappeared.
1 parent 14ba3ac commit 85ebff1

File tree

1 file changed

+18
-10
lines changed

1 file changed

+18
-10
lines changed

lib/widgets/compose_box.dart

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import 'color.dart';
2323
import 'dialog.dart';
2424
import 'icons.dart';
2525
import 'inset_shadow.dart';
26+
import 'page.dart';
2627
import 'store.dart';
2728
import 'text.dart';
2829
import 'theme.dart';
@@ -1659,6 +1660,9 @@ class EditMessageComposeBoxController extends ComposeBoxController {
16591660
String? originalRawContent;
16601661
}
16611662

1663+
/// A banner to display over or instead of interactive compose-box content.
1664+
///
1665+
/// Must have a [PageRoot] ancestor.
16621666
abstract class _Banner extends StatelessWidget {
16631667
const _Banner();
16641668

@@ -1675,7 +1679,11 @@ abstract class _Banner extends StatelessWidget {
16751679
/// https://github.com/zulip/zulip-flutter/pull/1432#discussion_r2023907300
16761680
///
16771681
/// To control the element's distance from the end edge, override [padEnd].
1678-
Widget? buildTrailing(BuildContext context);
1682+
///
1683+
/// The passed [BuildContext] will be the result of [PageRoot.contextOf],
1684+
/// so it's expected to remain mounted until the whole page disappears,
1685+
/// which may be long after the banner disappears.
1686+
Widget? buildTrailing(BuildContext pageContext);
16791687

16801688
/// Whether to apply `end: 8` in [SafeArea.minimum].
16811689
///
@@ -1694,7 +1702,7 @@ abstract class _Banner extends StatelessWidget {
16941702
color: getLabelColor(designVariables),
16951703
).merge(weightVariableTextStyle(context, wght: 600));
16961704

1697-
final trailing = buildTrailing(context);
1705+
final trailing = buildTrailing(PageRoot.contextOf(context));
16981706
return DecoratedBox(
16991707
decoration: BoxDecoration(
17001708
color: getBackgroundColor(designVariables)),
@@ -1740,7 +1748,7 @@ class _ErrorBanner extends _Banner {
17401748
designVariables.bannerBgIntDanger;
17411749

17421750
@override
1743-
Widget? buildTrailing(context) {
1751+
Widget? buildTrailing(pageContext) {
17441752
// An "x" button can go here.
17451753
// 24px square with 8px touchable padding in all directions?
17461754
// and `bool get padEnd => false`; see Figma:
@@ -1766,17 +1774,17 @@ class _EditMessageBanner extends _Banner {
17661774
Color getBackgroundColor(DesignVariables designVariables) =>
17671775
designVariables.bannerBgIntInfo;
17681776

1769-
void _handleTapSave (BuildContext context) {
1770-
final store = PerAccountStoreWidget.of(context);
1777+
void _handleTapSave (BuildContext pageContext) {
1778+
final store = PerAccountStoreWidget.of(pageContext);
17711779
final controller = composeBoxState.controller;
17721780
if (controller is! EditMessageComposeBoxController) return; // TODO(log)
1773-
final zulipLocalizations = ZulipLocalizations.of(context);
1781+
final zulipLocalizations = ZulipLocalizations.of(pageContext);
17741782

17751783
if (controller.content.hasValidationErrors.value) {
17761784
final validationErrorMessages =
17771785
controller.content.validationErrors.map((error) =>
17781786
error.message(zulipLocalizations));
1779-
showErrorDialog(context: context,
1787+
showErrorDialog(context: pageContext,
17801788
title: zulipLocalizations.errorMessageEditNotSaved,
17811789
message: validationErrorMessages.join('\n\n'));
17821790
return;
@@ -1799,16 +1807,16 @@ class _EditMessageBanner extends _Banner {
17991807
}
18001808

18011809
@override
1802-
Widget buildTrailing(context) {
1803-
final zulipLocalizations = ZulipLocalizations.of(context);
1810+
Widget buildTrailing(pageContext) {
1811+
final zulipLocalizations = ZulipLocalizations.of(pageContext);
18041812
return Row(mainAxisSize: MainAxisSize.min, spacing: 8, children: [
18051813
ZulipWebUiKitButton(label: zulipLocalizations.composeBoxBannerButtonCancel,
18061814
onPressed: composeBoxState.endEditInteraction),
18071815
// TODO(#1481) disabled appearance when there are validation errors
18081816
// or the original raw content hasn't loaded yet
18091817
ZulipWebUiKitButton(label: zulipLocalizations.composeBoxBannerButtonSave,
18101818
attention: ZulipWebUiKitButtonAttention.high,
1811-
onPressed: () => _handleTapSave(context)),
1819+
onPressed: () => _handleTapSave(pageContext)),
18121820
]);
18131821
}
18141822
}

0 commit comments

Comments
 (0)