@@ -23,6 +23,7 @@ import 'color.dart';
2323import 'dialog.dart' ;
2424import 'icons.dart' ;
2525import 'inset_shadow.dart' ;
26+ import 'page.dart' ;
2627import 'store.dart' ;
2728import 'text.dart' ;
2829import '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.
16621666abstract 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