Revert "Add error message and documentation when a `SnackBar` is off screen" (#104843) (#105284)
Co-authored-by: Kate Lovett <katelovett@google.com>
diff --git a/examples/api/lib/material/scaffold/scaffold_messenger_state.show_snack_bar.1.dart b/examples/api/lib/material/scaffold/scaffold_messenger_state.show_snack_bar.1.dart
deleted file mode 100644
index 0f25f1f..0000000
--- a/examples/api/lib/material/scaffold/scaffold_messenger_state.show_snack_bar.1.dart
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2014 The Flutter Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Flutter code sample for SnackBar
-
-import 'package:flutter/material.dart';
-
-void main() => runApp(const SnackBarApp());
-
-class SnackBarApp extends StatelessWidget {
- const SnackBarApp({super.key});
-
- @override
- Widget build(BuildContext context) {
- return const MaterialApp(
- home: SnackBarExample(),
- );
- }
-}
-
-class SnackBarExample extends StatefulWidget {
- const SnackBarExample({super.key});
-
- @override
- State<SnackBarExample> createState() => _SnackBarExampleState();
-}
-
-class _SnackBarExampleState extends State<SnackBarExample> {
- bool _largeLogo = false;
-
- @override
- Widget build(BuildContext context) {
- return Scaffold(
- appBar: AppBar(title: const Text('SnackBar Sample')),
- body: Padding(
- padding: const EdgeInsets.all(8.0),
- child: Column(
- children: <Widget>[
- ElevatedButton(
- onPressed: () {
- const SnackBar snackBar = SnackBar(
- content: Text('A SnackBar has been shown.'),
- behavior: SnackBarBehavior.floating,
- );
- ScaffoldMessenger.of(context).showSnackBar(snackBar);
- },
- child: const Text('Show SnackBar'),
- ),
- const SizedBox(height: 8.0),
- ElevatedButton(
- onPressed: () {
- setState(() => _largeLogo = !_largeLogo);
- },
- child: Text(_largeLogo ? 'Shrink Logo' : 'Grow Logo'),
- ),
- ],
- ),
- ),
- // A floating [SnackBar] is positioned above [Scaffold.floatingActionButton].
- // If the Widget provided to the floatingActionButton slot takes up too much space
- // for the SnackBar to be visible, an error will be thrown.
- floatingActionButton: Container(
- constraints: BoxConstraints.tightFor(
- width: 150,
- height: _largeLogo ? double.infinity : 150,
- ),
- decoration: const BoxDecoration(
- color: Colors.blueGrey,
- borderRadius: BorderRadius.all(Radius.circular(20)),
- ),
- child: const FlutterLogo(),
- ),
- );
- }
-}
diff --git a/examples/api/test/material/scaffold/scaffold_messenger_state.show_snack_bar.1_test.dart b/examples/api/test/material/scaffold/scaffold_messenger_state.show_snack_bar.1_test.dart
deleted file mode 100644
index 27b967a..0000000
--- a/examples/api/test/material/scaffold/scaffold_messenger_state.show_snack_bar.1_test.dart
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2014 The Flutter Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'package:flutter/material.dart';
-import 'package:flutter_api_samples/material/scaffold/scaffold_messenger_state.show_snack_bar.1.dart' as example;
-import 'package:flutter_test/flutter_test.dart';
-
-void main() {
- testWidgets('Floating SnackBar is visible', (WidgetTester tester) async {
- await tester.pumpWidget(
- const example.SnackBarApp(),
- );
-
- final Finder buttonFinder = find.byType(ElevatedButton);
- await tester.tap(buttonFinder.first);
- // Have the SnackBar fully animate out.
- await tester.pumpAndSettle();
-
- final Finder snackBarFinder = find.byType(SnackBar);
- expect(snackBarFinder, findsOneWidget);
-
- // Grow logo to send SnackBar off screen.
- await tester.tap(buttonFinder.last);
- await tester.pumpAndSettle();
-
- final AssertionError exception = tester.takeException() as AssertionError;
- const String message = 'Floating SnackBar presented off screen.\n'
- 'A SnackBar with behavior property set to SnackBarBehavior.floating is fully '
- 'or partially off screen because some or all the widgets provided to '
- 'Scaffold.floatingActionButton, Scaffold.persistentFooterButtons and '
- 'Scaffold.bottomNavigationBar take up too much vertical space.\n'
- 'Consider constraining the size of these widgets to allow room for the SnackBar to be visible.';
- expect(exception.message, message);
- });
-}
diff --git a/packages/flutter/lib/src/material/scaffold.dart b/packages/flutter/lib/src/material/scaffold.dart
index 98b2b6e..9d5c753 100644
--- a/packages/flutter/lib/src/material/scaffold.dart
+++ b/packages/flutter/lib/src/material/scaffold.dart
@@ -264,23 +264,6 @@
///
/// ** See code in examples/api/lib/material/scaffold/scaffold_messenger_state.show_snack_bar.0.dart **
/// {@end-tool}
- ///
- /// ## Relative positioning of floating SnackBars
- ///
- /// A [SnackBar] with [SnackBar.behavior] set to [SnackBarBehavior.floating] is
- /// positioned above the widgets provided to [Scaffold.floatingActionButton],
- /// [Scaffold.persistentFooterButtons], and [Scaffold.bottomNavigationBar].
- /// If some or all of these widgets take up enough space such that the SnackBar
- /// would not be visible when positioned above them, an error will be thrown.
- /// In this case, consider constraining the size of these widgets to allow room for
- /// the SnackBar to be visible.
- ///
- /// {@tool dartpad}
- /// Here is an example showing that a floating [SnackBar] appears above [Scaffold.floatingActionButton].
- ///
- /// ** See code in examples/api/lib/material/scaffold/scaffold_messenger_state.show_snack_bar.1.dart **
- /// {@end-tool}
- ///
ScaffoldFeatureController<SnackBar, SnackBarClosedReason> showSnackBar(SnackBar snackBar) {
assert(
_scaffolds.isNotEmpty,
@@ -1135,32 +1118,6 @@
final double xOffset = hasCustomWidth ? (size.width - snackBarWidth!) / 2 : 0.0;
positionChild(_ScaffoldSlot.snackBar, Offset(xOffset, snackBarYOffsetBase - snackBarSize.height));
-
- assert((){
- // Whether a floating SnackBar has been offsetted too high.
- //
- // To improve the developper experience, this assert is done after the call to positionChild.
- // if we assert sooner the SnackBar is visible because its defaults position is (0,0) and
- // it can cause confusion to the user as the error message states that the SnackBar is off screen.
- if (isSnackBarFloating) {
- final bool snackBarVisible = (snackBarYOffsetBase - snackBarSize.height) > 0;
- if (!snackBarVisible) {
- throw FlutterError.fromParts(<DiagnosticsNode>[
- ErrorSummary('Floating SnackBar presented off screen.'),
- ErrorDescription(
- 'A SnackBar with behavior property set to SnackBarBehavior.floating is fully '
- 'or partially off screen because some or all the widgets provided to '
- 'Scaffold.floatingActionButton, Scaffold.persistentFooterButtons and '
- 'Scaffold.bottomNavigationBar take up too much vertical space.\n'
- ),
- ErrorHint(
- 'Consider constraining the size of these widgets to allow room for the SnackBar to be visible.',
- ),
- ]);
- }
- }
- return true;
- }());
}
if (hasChild(_ScaffoldSlot.statusBar)) {
diff --git a/packages/flutter/test/material/snack_bar_test.dart b/packages/flutter/test/material/snack_bar_test.dart
index 70bbd0d..98faa2a 100644
--- a/packages/flutter/test/material/snack_bar_test.dart
+++ b/packages/flutter/test/material/snack_bar_test.dart
@@ -1652,72 +1652,6 @@
},
);
- void openFloatingSnackBar(WidgetTester tester) {
- final ScaffoldMessengerState scaffoldMessengerState = tester.state(find.byType(ScaffoldMessenger));
- scaffoldMessengerState.showSnackBar(
- const SnackBar(
- content: Text('SnackBar text'),
- behavior: SnackBarBehavior.floating,
- ),
- );
- }
-
- void expectSnackBarNotVisibleError(WidgetTester tester) {
- final AssertionError exception = tester.takeException() as AssertionError;
- const String message = 'Floating SnackBar presented off screen.\n'
- 'A SnackBar with behavior property set to SnackBarBehavior.floating is fully '
- 'or partially off screen because some or all the widgets provided to '
- 'Scaffold.floatingActionButton, Scaffold.persistentFooterButtons and '
- 'Scaffold.bottomNavigationBar take up too much vertical space.\n'
- 'Consider constraining the size of these widgets to allow room for the SnackBar to be visible.';
- expect(exception.message, message);
- }
-
- testWidgets('Snackbar with SnackBarBehavior.floating will assert when offsetted too high by a large Scaffold.floatingActionButton', (WidgetTester tester) async {
- // Regression test for https://github.com/flutter/flutter/issues/84263
- await tester.pumpWidget(
- MaterialApp(
- home: Scaffold(
- floatingActionButton: Container(),
- ),
- ),
- );
-
- openFloatingSnackBar(tester);
- await tester.pumpAndSettle(); // Have the SnackBar fully animate out.
- expectSnackBarNotVisibleError(tester);
- });
-
- testWidgets('Snackbar with SnackBarBehavior.floating will assert when offsetted too high by a large Scaffold.persistentFooterButtons', (WidgetTester tester) async {
- // Regression test for https://github.com/flutter/flutter/issues/84263
- await tester.pumpWidget(
- const MaterialApp(
- home: Scaffold(
- persistentFooterButtons: <Widget>[SizedBox(height: 1000)],
- ),
- ),
- );
-
- openFloatingSnackBar(tester);
- await tester.pumpAndSettle(); // Have the SnackBar fully animate out.
- expectSnackBarNotVisibleError(tester);
- });
-
- testWidgets('Snackbar with SnackBarBehavior.floating will assert when offsetted too high by a large Scaffold.bottomNavigationBar', (WidgetTester tester) async {
- // Regression test for https://github.com/flutter/flutter/issues/84263
- await tester.pumpWidget(
- const MaterialApp(
- home: Scaffold(
- bottomNavigationBar: SizedBox(height: 1000),
- ),
- ),
- );
-
- openFloatingSnackBar(tester);
- await tester.pumpAndSettle(); // Have the SnackBar fully animate out.
- expectSnackBarNotVisibleError(tester);
- });
-
testWidgets(
'SnackBar has correct end padding when it contains an action with fixed behavior',
(WidgetTester tester) async {