Revert "migrate some material files to nullsafety (#67078)" (#67183)
This reverts commit 81439922626f955a532c02180491bc7f3524baf2.
diff --git a/packages/flutter/lib/src/material/about.dart b/packages/flutter/lib/src/material/about.dart
index d1ed48b..ba92076 100644
--- a/packages/flutter/lib/src/material/about.dart
+++ b/packages/flutter/lib/src/material/about.dart
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// @dart = 2.8
+
import 'dart:developer' show Timeline, Flow;
import 'dart:io' show Platform;
@@ -121,7 +123,7 @@
/// derived from the nearest [Title] widget. The version, icon, and legalese
/// values default to the empty string.
const AboutListTile({
- Key? key,
+ Key key,
this.icon,
this.child,
this.applicationName,
@@ -138,13 +140,13 @@
///
/// This is not necessarily the same as the image shown in the dialog box
/// itself; which is controlled by the [applicationIcon] property.
- final Widget? icon;
+ final Widget icon;
/// The label to show on this drawer item.
///
/// Defaults to a text widget that says "About Foo" where "Foo" is the
/// application name specified by [applicationName].
- final Widget? child;
+ final Widget child;
/// The name of the application.
///
@@ -153,14 +155,14 @@
///
/// Defaults to the value of [Title.title], if a [Title] widget can be found.
/// Otherwise, defaults to [Platform.resolvedExecutable].
- final String? applicationName;
+ final String applicationName;
/// The version of this build of the application.
///
/// This string is shown under the application name in the [AboutDialog].
///
/// Defaults to the empty string.
- final String? applicationVersion;
+ final String applicationVersion;
/// The icon to show next to the application name in the [AboutDialog].
///
@@ -171,14 +173,14 @@
///
/// This is not necessarily the same as the icon shown on the drawer item
/// itself, which is controlled by the [icon] property.
- final Widget? applicationIcon;
+ final Widget applicationIcon;
/// A string to show in small print in the [AboutDialog].
///
/// Typically this is a copyright notice.
///
/// Defaults to the empty string.
- final String? applicationLegalese;
+ final String applicationLegalese;
/// Widgets to add to the [AboutDialog] after the name, version, and legalese.
///
@@ -186,14 +188,14 @@
/// or other information to show in the about box.
///
/// Defaults to nothing.
- final List<Widget>? aboutBoxChildren;
+ final List<Widget> aboutBoxChildren;
/// Whether this list tile is part of a vertically dense list.
///
/// If this property is null, then its value is based on [ListTileTheme.dense].
///
/// Dense list tiles default to a smaller height.
- final bool? dense;
+ final bool dense;
@override
Widget build(BuildContext context) {
@@ -201,7 +203,7 @@
assert(debugCheckHasMaterialLocalizations(context));
return ListTile(
leading: icon,
- title: child ?? Text(MaterialLocalizations.of(context)!.aboutListTileTitle(
+ title: child ?? Text(MaterialLocalizations.of(context).aboutListTileTitle(
applicationName ?? _defaultApplicationName(context),
)),
dense: dense,
@@ -236,14 +238,14 @@
/// The [context], [useRootNavigator] and [routeSettings] arguments are passed to
/// [showDialog], the documentation for which discusses how it is used.
void showAboutDialog({
- required BuildContext context,
- String? applicationName,
- String? applicationVersion,
- Widget? applicationIcon,
- String? applicationLegalese,
- List<Widget>? children,
+ @required BuildContext context,
+ String applicationName,
+ String applicationVersion,
+ Widget applicationIcon,
+ String applicationLegalese,
+ List<Widget> children,
bool useRootNavigator = true,
- RouteSettings? routeSettings,
+ RouteSettings routeSettings,
}) {
assert(context != null);
assert(useRootNavigator != null);
@@ -283,16 +285,16 @@
/// The licenses shown on the [LicensePage] are those returned by the
/// [LicenseRegistry] API, which can be used to add more licenses to the list.
void showLicensePage({
- required BuildContext context,
- String? applicationName,
- String? applicationVersion,
- Widget? applicationIcon,
- String? applicationLegalese,
+ @required BuildContext context,
+ String applicationName,
+ String applicationVersion,
+ Widget applicationIcon,
+ String applicationLegalese,
bool useRootNavigator = false,
}) {
assert(context != null);
assert(useRootNavigator != null);
- Navigator.of(context, rootNavigator: useRootNavigator)!.push(MaterialPageRoute<void>(
+ Navigator.of(context, rootNavigator: useRootNavigator).push(MaterialPageRoute<void>(
builder: (BuildContext context) => LicensePage(
applicationName: applicationName,
applicationVersion: applicationVersion,
@@ -328,7 +330,7 @@
/// derived from the nearest [Title] widget. The version, icon, and legalese
/// values default to the empty string.
const AboutDialog({
- Key? key,
+ Key key,
this.applicationName,
this.applicationVersion,
this.applicationIcon,
@@ -340,14 +342,14 @@
///
/// Defaults to the value of [Title.title], if a [Title] widget can be found.
/// Otherwise, defaults to [Platform.resolvedExecutable].
- final String? applicationName;
+ final String applicationName;
/// The version of this build of the application.
///
/// This string is shown under the application name.
///
/// Defaults to the empty string.
- final String? applicationVersion;
+ final String applicationVersion;
/// The icon to show next to the application name.
///
@@ -355,14 +357,14 @@
///
/// Typically this will be an [ImageIcon] widget. It should honor the
/// [IconTheme]'s [IconThemeData.size].
- final Widget? applicationIcon;
+ final Widget applicationIcon;
/// A string to show in small print.
///
/// Typically this is a copyright notice.
///
/// Defaults to the empty string.
- final String? applicationLegalese;
+ final String applicationLegalese;
/// Widgets to add to the dialog box after the name, version, and legalese.
///
@@ -370,30 +372,30 @@
/// or other information to show in the about box.
///
/// Defaults to nothing.
- final List<Widget>? children;
+ final List<Widget> children;
@override
Widget build(BuildContext context) {
assert(debugCheckHasMaterialLocalizations(context));
final String name = applicationName ?? _defaultApplicationName(context);
final String version = applicationVersion ?? _defaultApplicationVersion(context);
- final Widget? icon = applicationIcon ?? _defaultApplicationIcon(context);
+ final Widget icon = applicationIcon ?? _defaultApplicationIcon(context);
return AlertDialog(
content: ListBody(
children: <Widget>[
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
- if (icon != null) IconTheme(data: Theme.of(context)!.iconTheme, child: icon),
+ if (icon != null) IconTheme(data: Theme.of(context).iconTheme, child: icon),
Expanded(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 24.0),
child: ListBody(
children: <Widget>[
- Text(name, style: Theme.of(context)!.textTheme.headline5),
- Text(version, style: Theme.of(context)!.textTheme.bodyText2),
+ Text(name, style: Theme.of(context).textTheme.headline5),
+ Text(version, style: Theme.of(context).textTheme.bodyText2),
const SizedBox(height: _textVerticalSeparation),
- Text(applicationLegalese ?? '', style: Theme.of(context)!.textTheme.caption),
+ Text(applicationLegalese ?? '', style: Theme.of(context).textTheme.caption),
],
),
),
@@ -405,7 +407,7 @@
),
actions: <Widget>[
TextButton(
- child: Text(MaterialLocalizations.of(context)!.viewLicensesButtonLabel),
+ child: Text(MaterialLocalizations.of(context).viewLicensesButtonLabel),
onPressed: () {
showLicensePage(
context: context,
@@ -417,7 +419,7 @@
},
),
TextButton(
- child: Text(MaterialLocalizations.of(context)!.closeButtonLabel),
+ child: Text(MaterialLocalizations.of(context).closeButtonLabel),
onPressed: () {
Navigator.pop(context);
},
@@ -447,7 +449,7 @@
/// The licenses shown on the [LicensePage] are those returned by the
/// [LicenseRegistry] API, which can be used to add more licenses to the list.
const LicensePage({
- Key? key,
+ Key key,
this.applicationName,
this.applicationVersion,
this.applicationIcon,
@@ -458,14 +460,14 @@
///
/// Defaults to the value of [Title.title], if a [Title] widget can be found.
/// Otherwise, defaults to [Platform.resolvedExecutable].
- final String? applicationName;
+ final String applicationName;
/// The version of this build of the application.
///
/// This string is shown under the application name.
///
/// Defaults to the empty string.
- final String? applicationVersion;
+ final String applicationVersion;
/// The icon to show below the application name.
///
@@ -473,33 +475,33 @@
///
/// Typically this will be an [ImageIcon] widget. It should honor the
/// [IconTheme]'s [IconThemeData.size].
- final Widget? applicationIcon;
+ final Widget applicationIcon;
/// A string to show in small print.
///
/// Typically this is a copyright notice.
///
/// Defaults to the empty string.
- final String? applicationLegalese;
+ final String applicationLegalese;
@override
_LicensePageState createState() => _LicensePageState();
}
class _LicensePageState extends State<LicensePage> {
- final ValueNotifier<int?> selectedId = ValueNotifier<int?>(null);
+ final ValueNotifier<int> selectedId = ValueNotifier<int>(null);
@override
Widget build(BuildContext context) {
return _MasterDetailFlow(
detailPageFABlessGutterWidth: _getGutterSize(context),
- title: Text(MaterialLocalizations.of(context)!.licensesPageTitle),
+ title: Text(MaterialLocalizations.of(context).licensesPageTitle),
detailPageBuilder: _packageLicensePage,
masterViewBuilder: _packagesView,
);
}
- Widget _packageLicensePage(BuildContext _, Object? args, ScrollController? scrollController) {
+ Widget _packageLicensePage(BuildContext _, Object args, ScrollController scrollController) {
assert(args is _DetailArguments);
final _DetailArguments detailArguments = args as _DetailArguments;
return _PackageLicensePage(
@@ -526,9 +528,9 @@
class _AboutProgram extends StatelessWidget {
const _AboutProgram({
- Key? key,
- required this.name,
- required this.version,
+ Key key,
+ @required this.name,
+ @required this.version,
this.icon,
this.legalese,
}) : assert(name != null),
@@ -537,8 +539,8 @@
final String name;
final String version;
- final Widget? icon;
- final String? legalese;
+ final Widget icon;
+ final String legalese;
@override
Widget build(BuildContext context) {
@@ -551,26 +553,26 @@
children: <Widget>[
Text(
name,
- style: Theme.of(context)!.textTheme.headline5,
+ style: Theme.of(context).textTheme.headline5,
textAlign: TextAlign.center,
),
if (icon != null)
- IconTheme(data: Theme.of(context)!.iconTheme, child: icon!),
+ IconTheme(data: Theme.of(context).iconTheme, child: icon),
Text(
version,
- style: Theme.of(context)!.textTheme.bodyText2,
+ style: Theme.of(context).textTheme.bodyText2,
textAlign: TextAlign.center,
),
const SizedBox(height: _textVerticalSeparation),
Text(
legalese ?? '',
- style: Theme.of(context)!.textTheme.caption,
+ style: Theme.of(context).textTheme.caption,
textAlign: TextAlign.center,
),
const SizedBox(height: _textVerticalSeparation),
Text(
'Powered by Flutter',
- style: Theme.of(context)!.textTheme.bodyText2,
+ style: Theme.of(context).textTheme.bodyText2,
textAlign: TextAlign.center,
),
],
@@ -581,17 +583,17 @@
class _PackagesView extends StatefulWidget {
const _PackagesView({
- Key? key,
- required this.about,
- required this.isLateral,
- required this.selectedId,
+ Key key,
+ @required this.about,
+ @required this.isLateral,
+ @required this.selectedId,
}) : assert(about != null),
assert(isLateral != null),
super(key: key);
final Widget about;
final bool isLateral;
- final ValueNotifier<int?> selectedId;
+ final ValueNotifier<int> selectedId;
@override
_PackagesViewState createState() => _PackagesViewState();
@@ -615,17 +617,17 @@
builder: (BuildContext context, BoxConstraints constraints) {
switch (snapshot.connectionState) {
case ConnectionState.done:
- _initDefaultDetailPage(snapshot.data!, context);
- return ValueListenableBuilder<int?>(
+ _initDefaultDetailPage(snapshot.data, context);
+ return ValueListenableBuilder<int>(
valueListenable: widget.selectedId,
- builder: (BuildContext context, int? selectedId, Widget? _) {
+ builder: (BuildContext context, int selectedId, Widget _) {
return Center(
child: Material(
- color: Theme.of(context)!.cardColor,
+ color: Theme.of(context).cardColor,
elevation: 4.0,
child: Container(
constraints: BoxConstraints.loose(const Size.fromWidth(600.0)),
- child: _packagesList(context, selectedId, snapshot.data!, widget.isLateral),
+ child: _packagesList(context, selectedId, snapshot.data, widget.isLateral),
),
),
);
@@ -633,7 +635,7 @@
);
default:
return Material(
- color: Theme.of(context)!.cardColor,
+ color: Theme.of(context).cardColor,
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
@@ -654,8 +656,8 @@
return;
}
final String packageName = data.packages[widget.selectedId.value ?? 0];
- final List<int> bindings = data.packageLicenseBindings[packageName]!;
- _MasterDetailFlow.of(context)!.setInitialDetailPage(
+ final List<int> bindings = data.packageLicenseBindings[packageName];
+ _MasterDetailFlow.of(context).setInitialDetailPage(
_DetailArguments(
packageName,
bindings.map((int i) => data.licenses[i]).toList(growable: false),
@@ -665,7 +667,7 @@
Widget _packagesList(
final BuildContext context,
- final int? selectedId,
+ final int selectedId,
final _LicenseData data,
final bool drawSelection,
) {
@@ -678,7 +680,7 @@
.map<Widget>((MapEntry<int, String> entry) {
final String packageName = entry.value;
final int index = entry.key;
- final List<int> bindings = data.packageLicenseBindings[packageName]!;
+ final List<int> bindings = data.packageLicenseBindings[packageName];
return _PackageListTile(
packageName: packageName,
index: index,
@@ -686,7 +688,7 @@
numberLicenses: bindings.length,
onTap: () {
widget.selectedId.value = index;
- _MasterDetailFlow.of(context)!.openDetailPage(_DetailArguments(
+ _MasterDetailFlow.of(context).openDetailPage(_DetailArguments(
packageName,
bindings.map((int i) => data.licenses[i]).toList(growable: false),
));
@@ -700,27 +702,27 @@
class _PackageListTile extends StatelessWidget {
const _PackageListTile({
- Key? key,
- required this.packageName,
+ Key key,
+ this.packageName,
this.index,
- required this.isSelected,
- required this.numberLicenses,
+ this.isSelected,
+ this.numberLicenses,
this.onTap,
}) : super(key:key);
final String packageName;
- final int? index;
+ final int index;
final bool isSelected;
final int numberLicenses;
- final GestureTapCallback? onTap;
+ final GestureTapCallback onTap;
@override
Widget build(BuildContext context) {
return Ink(
- color: isSelected ? Theme.of(context)!.highlightColor : Theme.of(context)!.cardColor,
+ color: isSelected ? Theme.of(context).highlightColor : Theme.of(context).cardColor,
child: ListTile(
title: Text(packageName),
- subtitle: Text(MaterialLocalizations.of(context)!.licensesPackageDetailText(numberLicenses)),
+ subtitle: Text(MaterialLocalizations.of(context).licensesPackageDetailText(numberLicenses)),
selected: isSelected,
onTap: onTap,
),
@@ -738,7 +740,7 @@
// Special treatment for the first package since it should be the package
// for delivered application.
- String? firstPackage;
+ String firstPackage;
void addLicense(LicenseEntry entry) {
// Before the license can be added, we must first record the packages to
@@ -748,7 +750,7 @@
// Bind this license to the package using the next index value. This
// creates a contract that this license must be inserted at this same
// index value.
- packageLicenseBindings[package]!.add(licenses.length);
+ packageLicenseBindings[package].add(licenses.length);
}
licenses.add(entry); // Completion of the contract above.
}
@@ -766,7 +768,7 @@
/// Sort the packages using some comparison method, or by the default manner,
/// which is to put the application package first, followed by every other
/// package in case-insensitive alphabetical order.
- void sortPackages([int Function(String a, String b)? compare]) {
+ void sortPackages([int compare(String a, String b)]) {
packages.sort(compare ?? (String a, String b) {
// Based on how LicenseRegistry currently behaves, the first package
// returned is the end user application license. This should be
@@ -804,15 +806,15 @@
class _PackageLicensePage extends StatefulWidget {
const _PackageLicensePage({
- Key? key,
- required this.packageName,
- required this.licenseEntries,
- required this.scrollController,
+ Key key,
+ this.packageName,
+ this.licenseEntries,
+ this.scrollController,
}) : super(key: key);
final String packageName;
final List<LicenseEntry> licenseEntries;
- final ScrollController? scrollController;
+ final ScrollController scrollController;
@override
_PackageLicensePageState createState() => _PackageLicensePageState();
@@ -845,7 +847,7 @@
return true;
}());
final List<LicenseParagraph> paragraphs =
- await SchedulerBinding.instance!.scheduleTask<List<LicenseParagraph>>(
+ await SchedulerBinding.instance.scheduleTask<List<LicenseParagraph>>(
license.paragraphs.toList,
Priority.animation,
debugLabel: 'License',
@@ -890,8 +892,8 @@
@override
Widget build(BuildContext context) {
assert(debugCheckHasMaterialLocalizations(context));
- final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
- final ThemeData? theme = Theme.of(context);
+ final MaterialLocalizations localizations = MaterialLocalizations.of(context);
+ final ThemeData theme = Theme.of(context);
final String title = widget.packageName;
final String subtitle = localizations.licensesPackageDetailText(widget.licenseEntries.length);
final double pad = _getGutterSize(context);
@@ -914,7 +916,7 @@
title: _PackageLicensePageTitle(
title,
subtitle,
- theme!.appBarTheme.textTheme ?? theme.primaryTextTheme,
+ theme.appBarTheme.textTheme ?? theme.primaryTextTheme,
),
),
body: Center(
@@ -941,7 +943,7 @@
SliverAppBar(
automaticallyImplyLeading: false,
pinned: true,
- backgroundColor: theme!.cardColor,
+ backgroundColor: theme.cardColor,
title: _PackageLicensePageTitle(title, subtitle, theme.textTheme),
),
SliverPadding(
@@ -972,7 +974,7 @@
this.title,
this.subtitle,
this.theme, {
- Key? key,
+ Key key,
}) : super(key: key);
final String title;
@@ -999,7 +1001,7 @@
// someone really wants their application title to change dynamically, they
// can provide an explicit applicationName to the widgets defined in this
// file, instead of relying on the default.
- final Title? ancestorTitle = context.findAncestorWidgetOfExactType<Title>();
+ final Title ancestorTitle = context.findAncestorWidgetOfExactType<Title>();
return ancestorTitle?.title ?? Platform.resolvedExecutable.split(Platform.pathSeparator).last;
}
@@ -1008,7 +1010,7 @@
return '';
}
-Widget? _defaultApplicationIcon(BuildContext context) {
+Widget _defaultApplicationIcon(BuildContext context) {
// TODO(ianh): Get this from the embedder somehow.
return null;
}
@@ -1018,7 +1020,7 @@
const double _narrowGutterSize = 12.0;
double _getGutterSize(BuildContext context) =>
- MediaQuery.of(context)!.size.width >= _materialGutterThreshold ? _wideGutterSize : _narrowGutterSize;
+ MediaQuery.of(context).size.width >= _materialGutterThreshold ? _wideGutterSize : _narrowGutterSize;
/// Signature for the builder callback used by [_MasterDetailFlow].
typedef _MasterViewBuilder = Widget Function(BuildContext context, bool isLateralUI);
@@ -1027,7 +1029,7 @@
///
/// scrollController is provided when the page destination is the draggable
/// sheet in the lateral UI. Otherwise, it is null.
-typedef _DetailPageBuilder = Widget Function(BuildContext context, Object? arguments, ScrollController? scrollController);
+typedef _DetailPageBuilder = Widget Function(BuildContext context, Object arguments, ScrollController scrollController);
/// Signature for the builder callback used by [_MasterDetailFlow.actionBuilder].
///
@@ -1076,9 +1078,9 @@
/// Creates a master detail navigation flow which is either nested or
/// lateral depending on screen width.
const _MasterDetailFlow({
- Key? key,
- required this.detailPageBuilder,
- required this.masterViewBuilder,
+ Key key,
+ @required this.detailPageBuilder,
+ @required this.masterViewBuilder,
this.actionBuilder,
this.automaticallyImplyLeading = true,
this.breakpoint,
@@ -1111,7 +1113,7 @@
/// This builder is usually a wrapper around the [masterViewBuilder] builder to provide the
/// extra UI required to make a page. However, this builder is optional, and the master page
/// can be built using the master view builder and the configuration for the lateral UI's app bar.
- final _MasterViewBuilder? masterPageBuilder;
+ final _MasterViewBuilder masterPageBuilder;
/// Builder for the detail page.
///
@@ -1122,29 +1124,29 @@
final _DetailPageBuilder detailPageBuilder;
/// Override the width of the master view in the lateral UI.
- final double? masterViewWidth;
+ final double masterViewWidth;
/// Override the width of the floating action button gutter in the lateral UI.
- final double? detailPageFABGutterWidth;
+ final double detailPageFABGutterWidth;
/// Override the width of the gutter when there is no floating action button.
- final double? detailPageFABlessGutterWidth;
+ final double detailPageFABlessGutterWidth;
/// Add a floating action button to the lateral UI. If no [masterPageBuilder] is supplied, this
/// floating action button is also used on the nested master page.
///
/// See [Scaffold.floatingActionButton].
- final FloatingActionButton? floatingActionButton;
+ final FloatingActionButton floatingActionButton;
/// The title for the lateral UI [AppBar].
///
/// See [AppBar.title].
- final Widget? title;
+ final Widget title;
/// A widget to display before the title for the lateral UI [AppBar].
///
/// See [AppBar.leading].
- final Widget? leading;
+ final Widget leading;
/// Override the framework from determining whether to show a leading widget or not.
///
@@ -1155,10 +1157,10 @@
/// app bar or not.
///
/// See [AppBar.centerTitle].
- final bool? centerTitle;
+ final bool centerTitle;
/// See [AppBar.flexibleSpace].
- final Widget? flexibleSpace;
+ final Widget flexibleSpace;
/// Build actions for the lateral UI, and potentially the master page in the nested UI.
///
@@ -1169,25 +1171,25 @@
/// by [_MasterDetailFlow], then [_ActionLevel.composite] indicates the
/// actions are for the
/// nested master page.
- final _ActionBuilder? actionBuilder;
+ final _ActionBuilder actionBuilder;
/// Determine where the floating action button will go.
///
/// If null, [FloatingActionButtonLocation.endTop] is used.
///
/// Also see [Scaffold.floatingActionButtonLocation].
- final FloatingActionButtonLocation? floatingActionButtonLocation;
+ final FloatingActionButtonLocation floatingActionButtonLocation;
/// Determine where the floating action button will go on the master page.
///
/// See [Scaffold.floatingActionButtonLocation].
- final FloatingActionButtonLocation? floatingActionButtonMasterPageLocation;
+ final FloatingActionButtonLocation floatingActionButtonMasterPageLocation;
/// Forces display mode and style.
final _LayoutMode displayMode;
/// Width at which layout changes from nested to lateral.
- final double? breakpoint;
+ final double breakpoint;
@override
_MasterDetailFlowState createState() => _MasterDetailFlowState();
@@ -1200,11 +1202,11 @@
/// ```dart
/// _MasterDetailFlow.of(context).openDetailPage(arguments);
/// ```
- static _MasterDetailFlowProxy? of(
+ static _MasterDetailFlowProxy of(
BuildContext context, {
bool nullOk = false,
}) {
- _PageOpener? pageOpener = context.findAncestorStateOfType<_MasterDetailScaffoldState>();
+ _PageOpener pageOpener = context.findAncestorStateOfType<_MasterDetailScaffoldState>();
pageOpener ??= context.findAncestorStateOfType<_MasterDetailFlowState>();
assert(() {
if (pageOpener == null && !nullOk) {
@@ -1251,10 +1253,10 @@
_Focus focus = _Focus.master;
/// Cache of arguments passed when opening a detail page. Used when rebuilding.
- Object? _cachedDetailArguments;
+ Object _cachedDetailArguments;
/// Record of the layout that was built.
- _LayoutMode? _builtLayout;
+ _LayoutMode _builtLayout;
/// Key to access navigator in the nested layout.
final GlobalKey<NavigatorState> _navigatorKey = GlobalKey<NavigatorState>();
@@ -1263,7 +1265,7 @@
void openDetailPage(Object arguments) {
_cachedDetailArguments = arguments;
if (_builtLayout == _LayoutMode.nested) {
- _navigatorKey.currentState!.pushNamed(_navDetail, arguments: arguments);
+ _navigatorKey.currentState.pushNamed(_navDetail, arguments: arguments);
} else {
focus = _Focus.detail;
}
@@ -1301,7 +1303,7 @@
return WillPopScope(
// Push pop check into nested navigator.
- onWillPop: () async => !(await _navigatorKey.currentState!.maybePop()),
+ onWillPop: () async => !(await _navigatorKey.currentState.maybePop()),
child: Navigator(
key: _navigatorKey,
initialRoute: 'initial',
@@ -1341,11 +1343,11 @@
return MaterialPageRoute<dynamic>(
builder: (BuildContext c) => BlockSemantics(
child: widget.masterPageBuilder != null
- ? widget.masterPageBuilder!(c, false)
+ ? widget.masterPageBuilder(c, false)
: _MasterPage(
leading: widget.leading ??
- (widget.automaticallyImplyLeading && Navigator.of(context)!.canPop()
- ? BackButton(onPressed: () => Navigator.of(context)!.pop())
+ (widget.automaticallyImplyLeading && Navigator.of(context).canPop()
+ ? BackButton(onPressed: () => Navigator.of(context).pop())
: null),
title: widget.title,
centerTitle: widget.centerTitle,
@@ -1360,13 +1362,13 @@
);
}
- MaterialPageRoute<void> _detailPageRoute(Object? arguments) {
+ MaterialPageRoute<void> _detailPageRoute(Object arguments) {
return MaterialPageRoute<dynamic>(builder: (BuildContext context) {
return WillPopScope(
onWillPop: () async {
// No need for setState() as rebuild happens on navigation pop.
focus = _Focus.master;
- Navigator.of(context)!.pop();
+ Navigator.of(context).pop();
return false;
},
child: BlockSemantics(child: widget.detailPageBuilder(context, arguments, null)),
@@ -1380,7 +1382,7 @@
actionBuilder: widget.actionBuilder ?? (_, __) => const<Widget>[],
automaticallyImplyLeading: widget.automaticallyImplyLeading,
centerTitle: widget.centerTitle,
- detailPageBuilder: (BuildContext context, Object? args, ScrollController? scrollController) =>
+ detailPageBuilder: (BuildContext context, Object args, ScrollController scrollController) =>
widget.detailPageBuilder(context, args ?? _cachedDetailArguments, scrollController),
floatingActionButton: widget.floatingActionButton,
detailPageFABlessGutterWidth: widget.detailPageFABlessGutterWidth,
@@ -1397,7 +1399,7 @@
class _MasterPage extends StatelessWidget {
const _MasterPage({
- Key? key,
+ Key key,
this.leading,
this.title,
this.actionBuilder,
@@ -1406,18 +1408,18 @@
this.floatingActionButton,
this.floatingActionButtonLocation,
this.masterViewBuilder,
- required this.automaticallyImplyLeading,
+ this.automaticallyImplyLeading,
}) : super(key: key);
- final _MasterViewBuilder? masterViewBuilder;
- final Widget? title;
- final Widget? leading;
+ final _MasterViewBuilder masterViewBuilder;
+ final Widget title;
+ final Widget leading;
final bool automaticallyImplyLeading;
- final bool? centerTitle;
- final Widget? flexibleSpace;
- final _ActionBuilder? actionBuilder;
- final FloatingActionButton? floatingActionButton;
- final FloatingActionButtonLocation? floatingActionButtonLocation;
+ final bool centerTitle;
+ final Widget flexibleSpace;
+ final _ActionBuilder actionBuilder;
+ final FloatingActionButton floatingActionButton;
+ final FloatingActionButtonLocation floatingActionButtonLocation;
@override
Widget build(BuildContext context) {
@@ -1427,12 +1429,12 @@
leading: leading,
actions: actionBuilder == null
? const <Widget>[]
- : actionBuilder!(context, _ActionLevel.composite),
+ : actionBuilder(context, _ActionLevel.composite),
centerTitle: centerTitle,
flexibleSpace: flexibleSpace,
automaticallyImplyLeading: automaticallyImplyLeading,
),
- body: masterViewBuilder!(context, false),
+ body: masterViewBuilder(context, false),
floatingActionButton: floatingActionButton,
floatingActionButtonLocation: floatingActionButtonLocation,
);
@@ -1447,16 +1449,16 @@
class _MasterDetailScaffold extends StatefulWidget {
const _MasterDetailScaffold({
- Key? key,
- required this.detailPageBuilder,
- required this.masterViewBuilder,
+ Key key,
+ @required this.detailPageBuilder,
+ @required this.masterViewBuilder,
this.actionBuilder,
this.floatingActionButton,
this.floatingActionButtonLocation,
this.initialArguments,
this.leading,
this.title,
- required this.automaticallyImplyLeading,
+ this.automaticallyImplyLeading,
this.centerTitle,
this.detailPageFABlessGutterWidth,
this.detailPageFABGutterWidth,
@@ -1473,17 +1475,17 @@
/// that uses the [ScrollController] provided. In fact, it is strongly recommended the entire
/// lateral page is scrollable.
final _DetailPageBuilder detailPageBuilder;
- final _ActionBuilder? actionBuilder;
- final FloatingActionButton? floatingActionButton;
- final FloatingActionButtonLocation? floatingActionButtonLocation;
- final Object? initialArguments;
- final Widget? leading;
- final Widget? title;
+ final _ActionBuilder actionBuilder;
+ final FloatingActionButton floatingActionButton;
+ final FloatingActionButtonLocation floatingActionButtonLocation;
+ final Object initialArguments;
+ final Widget leading;
+ final Widget title;
final bool automaticallyImplyLeading;
- final bool? centerTitle;
- final double? detailPageFABlessGutterWidth;
- final double? detailPageFABGutterWidth;
- final double? masterViewWidth;
+ final bool centerTitle;
+ final double detailPageFABlessGutterWidth;
+ final double detailPageFABGutterWidth;
+ final double masterViewWidth;
@override
_MasterDetailScaffoldState createState() => _MasterDetailScaffoldState();
@@ -1491,12 +1493,12 @@
class _MasterDetailScaffoldState extends State<_MasterDetailScaffold>
implements _PageOpener {
- late FloatingActionButtonLocation floatingActionButtonLocation;
- late double detailPageFABGutterWidth;
- late double detailPageFABlessGutterWidth;
- late double masterViewWidth;
+ FloatingActionButtonLocation floatingActionButtonLocation;
+ double detailPageFABGutterWidth;
+ double detailPageFABlessGutterWidth;
+ double masterViewWidth;
- final ValueNotifier<Object?> _detailArguments = ValueNotifier<Object?>(null);
+ final ValueNotifier<Object> _detailArguments = ValueNotifier<Object>(null);
@override
void initState() {
@@ -1509,16 +1511,16 @@
@override
void openDetailPage(Object arguments) {
- SchedulerBinding.instance!
+ SchedulerBinding.instance
.addPostFrameCallback((_) => _detailArguments.value = arguments);
- _MasterDetailFlow.of(context)!.openDetailPage(arguments);
+ _MasterDetailFlow.of(context).openDetailPage(arguments);
}
@override
void setInitialDetailPage(Object arguments) {
- SchedulerBinding.instance!
+ SchedulerBinding.instance
.addPostFrameCallback((_) => _detailArguments.value = arguments);
- _MasterDetailFlow.of(context)!.setInitialDetailPage(arguments);
+ _MasterDetailFlow.of(context).setInitialDetailPage(arguments);
}
@override
@@ -1529,7 +1531,7 @@
floatingActionButtonLocation: floatingActionButtonLocation,
appBar: AppBar(
title: widget.title,
- actions: widget.actionBuilder!(context, _ActionLevel.top),
+ actions: widget.actionBuilder(context, _ActionLevel.top),
leading: widget.leading,
automaticallyImplyLeading: widget.automaticallyImplyLeading,
centerTitle: widget.centerTitle,
@@ -1542,10 +1544,10 @@
constraints:
BoxConstraints.tightFor(width: masterViewWidth),
child: IconTheme(
- data: Theme.of(context)!.primaryIconTheme,
+ data: Theme.of(context).primaryIconTheme,
child: ButtonBar(
children:
- widget.actionBuilder!(context, _ActionLevel.view),
+ widget.actionBuilder(context, _ActionLevel.view),
),
),
)
@@ -1565,9 +1567,9 @@
? detailPageFABlessGutterWidth
: detailPageFABGutterWidth,
),
- child: ValueListenableBuilder<Object?>(
+ child: ValueListenableBuilder<Object>(
valueListenable: _detailArguments,
- builder: (BuildContext context, Object? value, Widget? child) {
+ builder: (BuildContext context, Object value, Widget child) {
return AnimatedSwitcher(
transitionBuilder:
(Widget child, Animation<double> animation) =>
@@ -1576,7 +1578,7 @@
null, null, animation, null, child),
duration: const Duration(milliseconds: 500),
child: Container(
- key: ValueKey<Object?>(value ?? widget.initialArguments),
+ key: ValueKey<Object>(value ?? widget.initialArguments),
constraints: const BoxConstraints.expand(),
child: _DetailView(
builder: widget.detailPageBuilder,
@@ -1599,7 +1601,7 @@
? Scaffold(
appBar: AppBar(
title: widget.title,
- actions: widget.actionBuilder!(context, _ActionLevel.top),
+ actions: widget.actionBuilder(context, _ActionLevel.top),
leading: widget.leading,
automaticallyImplyLeading: widget.automaticallyImplyLeading,
centerTitle: widget.centerTitle,
@@ -1613,23 +1615,23 @@
class _DetailView extends StatelessWidget {
const _DetailView({
- Key? key,
- required _DetailPageBuilder builder,
- Object? arguments,
+ Key key,
+ @required _DetailPageBuilder builder,
+ Object arguments,
}) : assert(builder != null),
_builder = builder,
_arguments = arguments,
super(key: key);
final _DetailPageBuilder _builder;
- final Object? _arguments;
+ final Object _arguments;
@override
Widget build(BuildContext context) {
if (_arguments == null) {
return Container();
}
- final double screenHeight = MediaQuery.of(context)!.size.height;
+ final double screenHeight = MediaQuery.of(context).size.height;
final double minHeight = (screenHeight - kToolbarHeight) / screenHeight;
return DraggableScrollableSheet(
@@ -1641,7 +1643,7 @@
return MouseRegion(
// TODO(TonicArtos): Remove MouseRegion workaround for pointer hover events passing through DraggableScrollableSheet once https://github.com/flutter/flutter/issues/59741 is resolved.
child: Card(
- color: Theme.of(context)!.cardColor,
+ color: Theme.of(context).cardColor,
elevation: _kCardElevation,
clipBehavior: Clip.antiAlias,
margin: const EdgeInsets.fromLTRB(
diff --git a/packages/flutter/lib/src/material/app.dart b/packages/flutter/lib/src/material/app.dart
index 283998c..0ac7ce2 100644
--- a/packages/flutter/lib/src/material/app.dart
+++ b/packages/flutter/lib/src/material/app.dart
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// @dart = 2.8
+
import 'dart:ui' as ui;
import 'package:flutter/cupertino.dart';
@@ -164,7 +166,7 @@
///
/// The boolean arguments, [routes], and [navigatorObservers], must not be null.
const MaterialApp({
- Key? key,
+ Key key,
this.navigatorKey,
this.home,
this.routes = const <String, WidgetBuilder>{},
@@ -213,10 +215,10 @@
/// Creates a [MaterialApp] that uses the [Router] instead of a [Navigator].
const MaterialApp.router({
- Key? key,
+ Key key,
this.routeInformationProvider,
- required this.routeInformationParser,
- required this.routerDelegate,
+ @required this.routeInformationParser,
+ @required this.routerDelegate,
this.backButtonDispatcher,
this.builder,
this.title = '',
@@ -261,10 +263,10 @@
super(key: key);
/// {@macro flutter.widgets.widgetsApp.navigatorKey}
- final GlobalKey<NavigatorState>? navigatorKey;
+ final GlobalKey<NavigatorState> navigatorKey;
/// {@macro flutter.widgets.widgetsApp.home}
- final Widget? home;
+ final Widget home;
/// The application's top-level routing table.
///
@@ -274,41 +276,41 @@
/// an appropriate transition, including [Hero] animations, to the new route.
///
/// {@macro flutter.widgets.widgetsApp.routes}
- final Map<String, WidgetBuilder>? routes;
+ final Map<String, WidgetBuilder> routes;
/// {@macro flutter.widgets.widgetsApp.initialRoute}
- final String? initialRoute;
+ final String initialRoute;
/// {@macro flutter.widgets.widgetsApp.onGenerateRoute}
- final RouteFactory? onGenerateRoute;
+ final RouteFactory onGenerateRoute;
/// {@macro flutter.widgets.widgetsApp.onGenerateInitialRoutes}
- final InitialRouteListFactory? onGenerateInitialRoutes;
+ final InitialRouteListFactory onGenerateInitialRoutes;
/// {@macro flutter.widgets.widgetsApp.onUnknownRoute}
- final RouteFactory? onUnknownRoute;
+ final RouteFactory onUnknownRoute;
/// {@macro flutter.widgets.widgetsApp.navigatorObservers}
- final List<NavigatorObserver>? navigatorObservers;
+ final List<NavigatorObserver> navigatorObservers;
/// {@macro flutter.widgets.widgetsApp.routeInformationProvider}
- final RouteInformationProvider? routeInformationProvider;
+ final RouteInformationProvider routeInformationProvider;
/// {@macro flutter.widgets.widgetsApp.routeInformationParser}
- final RouteInformationParser<Object>? routeInformationParser;
+ final RouteInformationParser<Object> routeInformationParser;
/// {@macro flutter.widgets.widgetsApp.routerDelegate}
- final RouterDelegate<Object>? routerDelegate;
+ final RouterDelegate<Object> routerDelegate;
/// {@macro flutter.widgets.widgetsApp.backButtonDispatcher}
- final BackButtonDispatcher? backButtonDispatcher;
+ final BackButtonDispatcher backButtonDispatcher;
/// {@macro flutter.widgets.widgetsApp.builder}
///
/// Material specific features such as [showDialog] and [showMenu], and widgets
/// such as [Tooltip], [PopupMenuButton], also require a [Navigator] to properly
/// function.
- final TransitionBuilder? builder;
+ final TransitionBuilder builder;
/// {@macro flutter.widgets.widgetsApp.title}
///
@@ -318,7 +320,7 @@
/// {@macro flutter.widgets.widgetsApp.onGenerateTitle}
///
/// This value is passed unmodified to [WidgetsApp.onGenerateTitle].
- final GenerateAppTitle? onGenerateTitle;
+ final GenerateAppTitle onGenerateTitle;
/// Default visual properties, like colors fonts and shapes, for this app's
/// material widgets.
@@ -337,7 +339,7 @@
/// and [darkTheme] in [MaterialApp].
/// * [ThemeData.brightness], which indicates the [Brightness] of a theme's
/// colors.
- final ThemeData? theme;
+ final ThemeData theme;
/// The [ThemeData] to use when a 'dark mode' is requested by the system.
///
@@ -359,7 +361,7 @@
/// and [darkTheme] in [MaterialApp].
/// * [ThemeData.brightness], which is typically set to the value of
/// [MediaQueryData.platformBrightness].
- final ThemeData? darkTheme;
+ final ThemeData darkTheme;
/// The [ThemeData] to use when 'high contrast' is requested by the system.
///
@@ -372,7 +374,7 @@
///
/// * [MediaQueryData.highContrast], which indicates the platform's
/// desire to increase contrast.
- final ThemeData? highContrastTheme;
+ final ThemeData highContrastTheme;
/// The [ThemeData] to use when a 'dark mode' and 'high contrast' is requested
/// by the system.
@@ -388,7 +390,7 @@
///
/// * [MediaQueryData.highContrast], which indicates the platform's
/// desire to increase contrast.
- final ThemeData? highContrastDarkTheme;
+ final ThemeData highContrastDarkTheme;
/// Determines which theme will be used by the application if both [theme]
/// and [darkTheme] are provided.
@@ -414,13 +416,13 @@
/// * [darkTheme], which is used when a dark mode is selected.
/// * [ThemeData.brightness], which indicates to various parts of the
/// system what kind of theme is being used.
- final ThemeMode? themeMode;
+ final ThemeMode themeMode;
/// {@macro flutter.widgets.widgetsApp.color}
- final Color? color;
+ final Color color;
/// {@macro flutter.widgets.widgetsApp.locale}
- final Locale? locale;
+ final Locale locale;
/// {@macro flutter.widgets.widgetsApp.localizationsDelegates}
///
@@ -513,17 +515,17 @@
/// which provides material localizations for many languages.
/// * The Flutter Internationalization Tutorial,
/// <https://flutter.dev/tutorials/internationalization/>.
- final Iterable<LocalizationsDelegate<dynamic>>? localizationsDelegates;
+ final Iterable<LocalizationsDelegate<dynamic>> localizationsDelegates;
/// {@macro flutter.widgets.widgetsApp.localeListResolutionCallback}
///
/// This callback is passed along to the [WidgetsApp] built by this widget.
- final LocaleListResolutionCallback? localeListResolutionCallback;
+ final LocaleListResolutionCallback localeListResolutionCallback;
/// {@macro flutter.widgets.widgetsApp.localeResolutionCallback}
///
/// This callback is passed along to the [WidgetsApp] built by this widget.
- final LocaleResolutionCallback? localeResolutionCallback;
+ final LocaleResolutionCallback localeResolutionCallback;
/// {@macro flutter.widgets.widgetsApp.supportedLocales}
///
@@ -585,7 +587,7 @@
/// ```
/// {@end-tool}
/// {@macro flutter.widgets.widgetsApp.shortcuts.seeAlso}
- final Map<LogicalKeySet, Intent>? shortcuts;
+ final Map<LogicalKeySet, Intent> shortcuts;
/// {@macro flutter.widgets.widgetsApp.actions}
/// {@tool snippet}
@@ -618,10 +620,10 @@
/// ```
/// {@end-tool}
/// {@macro flutter.widgets.widgetsApp.actions.seeAlso}
- final Map<Type, Action<Intent>>? actions;
+ final Map<Type, Action<Intent>> actions;
/// {@macro flutter.widgets.widgetsApp.restorationScopeId}
- final String? restorationScopeId;
+ final String restorationScopeId;
/// Turns on a [GridPaper] overlay that paints a baseline grid
/// Material apps.
@@ -641,7 +643,7 @@
/// Used by the [MaterialApp].
static HeroController createMaterialHeroController() {
return HeroController(
- createRectTween: (Rect? begin, Rect? end) {
+ createRectTween: (Rect begin, Rect end) {
return MaterialRectArcTween(begin: begin, end: end);
},
);
@@ -651,7 +653,7 @@
class _MaterialScrollBehavior extends ScrollBehavior {
@override
TargetPlatform getPlatform(BuildContext context) {
- return Theme.of(context)!.platform;
+ return Theme.of(context).platform;
}
@override
@@ -669,14 +671,15 @@
return GlowingOverscrollIndicator(
child: child,
axisDirection: axisDirection,
- color: Theme.of(context)!.accentColor,
+ color: Theme.of(context).accentColor,
);
}
+ return null;
}
}
class _MaterialAppState extends State<MaterialApp> {
- late HeroController _heroController;
+ HeroController _heroController;
bool get _usesRouter => widget.routerDelegate != null;
@@ -693,7 +696,7 @@
// _MaterialLocalizationsDelegate.
Iterable<LocalizationsDelegate<dynamic>> get _localizationsDelegates sync* {
if (widget.localizationsDelegates != null)
- yield* widget.localizationsDelegates!;
+ yield* widget.localizationsDelegates;
yield DefaultMaterialLocalizations.delegate;
yield DefaultCupertinoLocalizations.delegate;
}
@@ -706,14 +709,14 @@
);
}
- Widget _materialBuilder(BuildContext context, Widget? child) {
+ Widget _materialBuilder(BuildContext context, Widget child) {
// Resolve which theme to use based on brightness and high contrast.
final ThemeMode mode = widget.themeMode ?? ThemeMode.system;
final Brightness platformBrightness = MediaQuery.platformBrightnessOf(context);
final bool useDarkTheme = mode == ThemeMode.dark
|| (mode == ThemeMode.system && platformBrightness == ui.Brightness.dark);
final bool highContrast = MediaQuery.highContrastOf(context);
- ThemeData? theme;
+ ThemeData theme;
if (useDarkTheme && highContrast && widget.highContrastDarkTheme != null) {
theme = widget.highContrastDarkTheme;
@@ -741,10 +744,10 @@
// surround widget.builder with yet another builder so that
// a context separates them and Theme.of() correctly
// resolves to the theme we passed to AnimatedTheme.
- return widget.builder!(context, child);
+ return widget.builder(context, child);
},
)
- : child!,
+ : child,
);
}
@@ -761,8 +764,8 @@
return WidgetsApp.router(
key: GlobalObjectKey(this),
routeInformationProvider: widget.routeInformationProvider,
- routeInformationParser: widget.routeInformationParser!,
- routerDelegate: widget.routerDelegate!,
+ routeInformationParser: widget.routeInformationParser,
+ routerDelegate: widget.routerDelegate,
backButtonDispatcher: widget.backButtonDispatcher,
builder: _materialBuilder,
title: widget.title,
@@ -789,12 +792,12 @@
return WidgetsApp(
key: GlobalObjectKey(this),
navigatorKey: widget.navigatorKey,
- navigatorObservers: widget.navigatorObservers!,
+ navigatorObservers: widget.navigatorObservers,
pageRouteBuilder: <T>(RouteSettings settings, WidgetBuilder builder) {
return MaterialPageRoute<T>(settings: settings, builder: builder);
},
home: widget.home,
- routes: widget.routes!,
+ routes: widget.routes,
initialRoute: widget.initialRoute,
onGenerateRoute: widget.onGenerateRoute,
onGenerateInitialRoutes: widget.onGenerateInitialRoutes,
diff --git a/packages/flutter/lib/src/material/app_bar.dart b/packages/flutter/lib/src/material/app_bar.dart
index 8b3dc67..c5e1e79 100644
--- a/packages/flutter/lib/src/material/app_bar.dart
+++ b/packages/flutter/lib/src/material/app_bar.dart
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// @dart = 2.8
+
import 'dart:math' as math;
import 'package:flutter/foundation.dart';
@@ -190,7 +192,7 @@
///
/// Typically used in the [Scaffold.appBar] property.
AppBar({
- Key? key,
+ Key key,
this.leading,
this.automaticallyImplyLeading = true,
this.title,
@@ -219,7 +221,7 @@
assert(titleSpacing != null),
assert(toolbarOpacity != null),
assert(bottomOpacity != null),
- preferredSize = Size.fromHeight(toolbarHeight ?? kToolbarHeight + (bottom?.preferredSize.height ?? 0.0)),
+ preferredSize = Size.fromHeight(toolbarHeight ?? kToolbarHeight + (bottom?.preferredSize?.height ?? 0.0)),
super(key: key);
/// A widget to display before the [title].
@@ -267,7 +269,7 @@
///
/// * [Scaffold.appBar], in which an [AppBar] is usually placed.
/// * [Scaffold.drawer], in which the [Drawer] is usually placed.
- final Widget? leading;
+ final Widget leading;
/// Controls whether we should try to imply the leading widget if null.
///
@@ -306,7 +308,7 @@
/// ),
/// )
/// ```
- final Widget? title;
+ final Widget title;
/// Widgets to display in a row after the [title] widget.
///
@@ -317,7 +319,7 @@
/// The [actions] become the trailing component of the [NavigationToolbar] built
/// by this widget. The height of each action is constrained to be no bigger
/// than the [toolbarHeight].
- final List<Widget>? actions;
+ final List<Widget> actions;
/// This widget is stacked behind the toolbar and the tab bar. It's height will
/// be the same as the app bar's overall height.
@@ -327,7 +329,7 @@
/// changes the [AppBar]'s height when scrolled.
///
/// Typically a [FlexibleSpaceBar]. See [FlexibleSpaceBar] for details.
- final Widget? flexibleSpace;
+ final Widget flexibleSpace;
/// This widget appears across the bottom of the app bar.
///
@@ -337,7 +339,7 @@
/// See also:
///
/// * [PreferredSize], which can be used to give an arbitrary widget a preferred size.
- final PreferredSizeWidget? bottom;
+ final PreferredSizeWidget bottom;
/// The z-coordinate at which to place this app bar relative to its parent.
///
@@ -348,20 +350,20 @@
/// If this property is null, then [AppBarTheme.elevation] of
/// [ThemeData.appBarTheme] is used. If that is also null, the default value
/// is 4.
- final double? elevation;
+ final double elevation;
/// The color to paint the shadow below the app bar.
///
/// If this property is null, then [AppBarTheme.shadowColor] of
/// [ThemeData.appBarTheme] is used. If that is also null, the default value
/// is fully opaque black.
- final Color? shadowColor;
+ final Color shadowColor;
/// The material's shape as well its shadow.
///
/// A shadow is only displayed if the [elevation] is greater than
/// zero.
- final ShapeBorder? shape;
+ final ShapeBorder shape;
/// The color to use for the app bar's material. Typically this should be set
/// along with [brightness], [iconTheme], [textTheme].
@@ -369,7 +371,7 @@
/// If this property is null, then [AppBarTheme.color] of
/// [ThemeData.appBarTheme] is used. If that is also null, then
/// [ThemeData.primaryColor] is used.
- final Color? backgroundColor;
+ final Color backgroundColor;
/// The brightness of the app bar's material. Typically this is set along
/// with [backgroundColor], [iconTheme], [textTheme].
@@ -377,7 +379,7 @@
/// If this property is null, then [AppBarTheme.brightness] of
/// [ThemeData.appBarTheme] is used. If that is also null, then
/// [ThemeData.primaryColorBrightness] is used.
- final Brightness? brightness;
+ final Brightness brightness;
/// The color, opacity, and size to use for app bar icons. Typically this
/// is set along with [backgroundColor], [brightness], [textTheme].
@@ -385,7 +387,7 @@
/// If this property is null, then [AppBarTheme.iconTheme] of
/// [ThemeData.appBarTheme] is used. If that is also null, then
/// [ThemeData.primaryIconTheme] is used.
- final IconThemeData? iconTheme;
+ final IconThemeData iconTheme;
/// The color, opacity, and size to use for the icons that appear in the app
/// bar's [actions]. This should only be used when the [actions] should be
@@ -395,7 +397,7 @@
/// If this property is null, then [AppBarTheme.actionsIconTheme] of
/// [ThemeData.appBarTheme] is used. If that is also null, then this falls
/// back to [iconTheme].
- final IconThemeData? actionsIconTheme;
+ final IconThemeData actionsIconTheme;
/// The typographic styles to use for text in the app bar. Typically this is
/// set along with [brightness] [backgroundColor], [iconTheme].
@@ -403,7 +405,7 @@
/// If this property is null, then [AppBarTheme.textTheme] of
/// [ThemeData.appBarTheme] is used. If that is also null, then
/// [ThemeData.primaryTextTheme] is used.
- final TextTheme? textTheme;
+ final TextTheme textTheme;
/// Whether this app bar is being displayed at the top of the screen.
///
@@ -417,7 +419,7 @@
/// If this property is null, then [AppBarTheme.centerTitle] of
/// [ThemeData.appBarTheme] is used. If that is also null, then value is
/// adapted to the current [TargetPlatform].
- final bool? centerTitle;
+ final bool centerTitle;
/// Whether the title should be wrapped with header [Semantics].
///
@@ -459,18 +461,18 @@
/// Defines the height of the toolbar component of an [AppBar].
///
/// By default, the value of `toolbarHeight` is [kToolbarHeight].
- final double? toolbarHeight;
+ final double toolbarHeight;
/// Defines the width of [leading] widget.
///
/// By default, the value of `leadingWidth` is 56.0.
- final double? leadingWidth;
+ final double leadingWidth;
bool _getEffectiveCenterTitle(ThemeData theme) {
if (centerTitle != null)
- return centerTitle!;
+ return centerTitle;
if (theme.appBarTheme.centerTitle != null)
- return theme.appBarTheme.centerTitle!;
+ return theme.appBarTheme.centerTitle;
assert(theme.platform != null);
switch (theme.platform) {
case TargetPlatform.android:
@@ -480,8 +482,9 @@
return false;
case TargetPlatform.iOS:
case TargetPlatform.macOS:
- return actions == null || actions!.length < 2;
+ return actions == null || actions.length < 2;
}
+ return null;
}
@override
@@ -493,21 +496,21 @@
static const Color _defaultShadowColor = Color(0xFF000000);
void _handleDrawerButton() {
- Scaffold.of(context)!.openDrawer();
+ Scaffold.of(context).openDrawer();
}
void _handleDrawerButtonEnd() {
- Scaffold.of(context)!.openEndDrawer();
+ Scaffold.of(context).openEndDrawer();
}
@override
Widget build(BuildContext context) {
assert(!widget.primary || debugCheckHasMediaQuery(context));
assert(debugCheckHasMaterialLocalizations(context));
- final ThemeData? theme = Theme.of(context);
+ final ThemeData theme = Theme.of(context);
final AppBarTheme appBarTheme = AppBarTheme.of(context);
- final ScaffoldState? scaffold = Scaffold.of(context, nullOk: true);
- final ModalRoute<dynamic>? parentRoute = ModalRoute.of(context);
+ final ScaffoldState scaffold = Scaffold.of(context, nullOk: true);
+ final ModalRoute<dynamic> parentRoute = ModalRoute.of(context);
final bool hasDrawer = scaffold?.hasDrawer ?? false;
final bool hasEndDrawer = scaffold?.hasEndDrawer ?? false;
@@ -518,23 +521,23 @@
IconThemeData overallIconTheme = widget.iconTheme
?? appBarTheme.iconTheme
- ?? theme!.primaryIconTheme;
+ ?? theme.primaryIconTheme;
IconThemeData actionsIconTheme = widget.actionsIconTheme
?? appBarTheme.actionsIconTheme
?? overallIconTheme;
- TextStyle? centerStyle = widget.textTheme?.headline6
+ TextStyle centerStyle = widget.textTheme?.headline6
?? appBarTheme.textTheme?.headline6
- ?? theme!.primaryTextTheme.headline6;
- TextStyle? sideStyle = widget.textTheme?.bodyText2
+ ?? theme.primaryTextTheme.headline6;
+ TextStyle sideStyle = widget.textTheme?.bodyText2
?? appBarTheme.textTheme?.bodyText2
- ?? theme!.primaryTextTheme.bodyText2;
+ ?? theme.primaryTextTheme.bodyText2;
if (widget.toolbarOpacity != 1.0) {
final double opacity = const Interval(0.25, 1.0, curve: Curves.fastOutSlowIn).transform(widget.toolbarOpacity);
if (centerStyle?.color != null)
- centerStyle = centerStyle!.copyWith(color: centerStyle.color!.withOpacity(opacity));
+ centerStyle = centerStyle.copyWith(color: centerStyle.color.withOpacity(opacity));
if (sideStyle?.color != null)
- sideStyle = sideStyle!.copyWith(color: sideStyle.color!.withOpacity(opacity));
+ sideStyle = sideStyle.copyWith(color: sideStyle.color.withOpacity(opacity));
overallIconTheme = overallIconTheme.copyWith(
opacity: opacity * (overallIconTheme.opacity ?? 1.0)
);
@@ -543,13 +546,13 @@
);
}
- Widget? leading = widget.leading;
+ Widget leading = widget.leading;
if (leading == null && widget.automaticallyImplyLeading) {
if (hasDrawer) {
leading = IconButton(
icon: const Icon(Icons.menu),
onPressed: _handleDrawerButton,
- tooltip: MaterialLocalizations.of(context)!.openAppDrawerTooltip,
+ tooltip: MaterialLocalizations.of(context).openAppDrawerTooltip,
);
} else {
if (!hasEndDrawer && canPop)
@@ -563,10 +566,10 @@
);
}
- Widget? title = widget.title;
+ Widget title = widget.title;
if (title != null) {
- bool? namesRoute;
- switch (theme!.platform) {
+ bool namesRoute;
+ switch (theme.platform) {
case TargetPlatform.android:
case TargetPlatform.fuchsia:
case TargetPlatform.linux:
@@ -599,7 +602,7 @@
// sizes. To opt out, wrap the [title] widget in a [MediaQuery] widget
// with [MediaQueryData.textScaleFactor] set to
// `MediaQuery.textScaleFactorOf(context)`.
- final MediaQueryData mediaQueryData = MediaQuery.of(context)!;
+ final MediaQueryData mediaQueryData = MediaQuery.of(context);
title = MediaQuery(
data: mediaQueryData.copyWith(
textScaleFactor: math.min(
@@ -611,18 +614,18 @@
);
}
- Widget? actions;
- if (widget.actions != null && widget.actions!.isNotEmpty) {
+ Widget actions;
+ if (widget.actions != null && widget.actions.isNotEmpty) {
actions = Row(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.stretch,
- children: widget.actions!,
+ children: widget.actions,
);
} else if (hasEndDrawer) {
actions = IconButton(
icon: const Icon(Icons.menu),
onPressed: _handleDrawerButtonEnd,
- tooltip: MaterialLocalizations.of(context)!.openAppDrawerTooltip,
+ tooltip: MaterialLocalizations.of(context).openAppDrawerTooltip,
);
}
@@ -638,7 +641,7 @@
leading: leading,
middle: title,
trailing: actions,
- centerMiddle: widget._getEffectiveCenterTitle(theme!),
+ centerMiddle: widget._getEffectiveCenterTitle(theme),
middleSpacing: widget.titleSpacing,
);
@@ -667,7 +670,7 @@
),
),
if (widget.bottomOpacity == 1.0)
- widget.bottom!
+ widget.bottom
else
Opacity(
opacity: const Interval(0.25, 1.0, curve: Curves.fastOutSlowIn).transform(widget.bottomOpacity),
@@ -746,7 +749,7 @@
}
class _FloatingAppBar extends StatefulWidget {
- const _FloatingAppBar({ Key? key, required this.child }) : super(key: key);
+ const _FloatingAppBar({ Key key, this.child }) : super(key: key);
final Widget child;
@@ -757,26 +760,26 @@
// A wrapper for the widget created by _SliverAppBarDelegate that starts and
// stops the floating app bar's snap-into-view or snap-out-of-view animation.
class _FloatingAppBarState extends State<_FloatingAppBar> {
- ScrollPosition? _position;
+ ScrollPosition _position;
@override
void didChangeDependencies() {
super.didChangeDependencies();
if (_position != null)
- _position!.isScrollingNotifier.removeListener(_isScrollingListener);
+ _position.isScrollingNotifier.removeListener(_isScrollingListener);
_position = Scrollable.of(context)?.position;
if (_position != null)
- _position!.isScrollingNotifier.addListener(_isScrollingListener);
+ _position.isScrollingNotifier.addListener(_isScrollingListener);
}
@override
void dispose() {
if (_position != null)
- _position!.isScrollingNotifier.removeListener(_isScrollingListener);
+ _position.isScrollingNotifier.removeListener(_isScrollingListener);
super.dispose();
}
- RenderSliverFloatingPersistentHeader? _headerRenderer() {
+ RenderSliverFloatingPersistentHeader _headerRenderer() {
return context.findAncestorRenderObjectOfType<RenderSliverFloatingPersistentHeader>();
}
@@ -786,11 +789,11 @@
// When a scroll stops, then maybe snap the appbar into view.
// Similarly, when a scroll starts, then maybe stop the snap animation.
- final RenderSliverFloatingPersistentHeader? header = _headerRenderer();
- if (_position!.isScrollingNotifier.value)
- header?.maybeStopSnapAnimation(_position!.userScrollDirection);
+ final RenderSliverFloatingPersistentHeader header = _headerRenderer();
+ if (_position.isScrollingNotifier.value)
+ header?.maybeStopSnapAnimation(_position.userScrollDirection);
else
- header?.maybeStartSnapAnimation(_position!.userScrollDirection);
+ header?.maybeStartSnapAnimation(_position.userScrollDirection);
}
@override
@@ -799,69 +802,69 @@
class _SliverAppBarDelegate extends SliverPersistentHeaderDelegate {
_SliverAppBarDelegate({
- required this.leading,
- required this.automaticallyImplyLeading,
- required this.title,
- required this.actions,
- required this.flexibleSpace,
- required this.bottom,
- required this.elevation,
- required this.shadowColor,
- required this.forceElevated,
- required this.backgroundColor,
- required this.brightness,
- required this.iconTheme,
- required this.actionsIconTheme,
- required this.textTheme,
- required this.primary,
- required this.centerTitle,
- required this.excludeHeaderSemantics,
- required this.titleSpacing,
- required this.expandedHeight,
- required this.collapsedHeight,
- required this.topPadding,
- required this.floating,
- required this.pinned,
- required this.vsync,
- required this.snapConfiguration,
- required this.stretchConfiguration,
- required this.showOnScreenConfiguration,
- required this.shape,
- required this.toolbarHeight,
- required this.leadingWidth,
+ @required this.leading,
+ @required this.automaticallyImplyLeading,
+ @required this.title,
+ @required this.actions,
+ @required this.flexibleSpace,
+ @required this.bottom,
+ @required this.elevation,
+ @required this.shadowColor,
+ @required this.forceElevated,
+ @required this.backgroundColor,
+ @required this.brightness,
+ @required this.iconTheme,
+ @required this.actionsIconTheme,
+ @required this.textTheme,
+ @required this.primary,
+ @required this.centerTitle,
+ @required this.excludeHeaderSemantics,
+ @required this.titleSpacing,
+ @required this.expandedHeight,
+ @required this.collapsedHeight,
+ @required this.topPadding,
+ @required this.floating,
+ @required this.pinned,
+ @required this.vsync,
+ @required this.snapConfiguration,
+ @required this.stretchConfiguration,
+ @required this.showOnScreenConfiguration,
+ @required this.shape,
+ @required this.toolbarHeight,
+ @required this.leadingWidth,
}) : assert(primary || topPadding == 0.0),
assert(
!floating || (snapConfiguration == null && showOnScreenConfiguration == null) || vsync != null,
'vsync cannot be null when snapConfiguration or showOnScreenConfiguration is not null, and floating is true',
),
- _bottomHeight = bottom?.preferredSize.height ?? 0.0;
+ _bottomHeight = bottom?.preferredSize?.height ?? 0.0;
- final Widget? leading;
+ final Widget leading;
final bool automaticallyImplyLeading;
- final Widget? title;
- final List<Widget>? actions;
- final Widget? flexibleSpace;
- final PreferredSizeWidget? bottom;
- final double? elevation;
- final Color? shadowColor;
+ final Widget title;
+ final List<Widget> actions;
+ final Widget flexibleSpace;
+ final PreferredSizeWidget bottom;
+ final double elevation;
+ final Color shadowColor;
final bool forceElevated;
- final Color? backgroundColor;
- final Brightness? brightness;
- final IconThemeData? iconTheme;
- final IconThemeData? actionsIconTheme;
- final TextTheme? textTheme;
+ final Color backgroundColor;
+ final Brightness brightness;
+ final IconThemeData iconTheme;
+ final IconThemeData actionsIconTheme;
+ final TextTheme textTheme;
final bool primary;
- final bool? centerTitle;
+ final bool centerTitle;
final bool excludeHeaderSemantics;
final double titleSpacing;
- final double? expandedHeight;
+ final double expandedHeight;
final double collapsedHeight;
final double topPadding;
final bool floating;
final bool pinned;
- final ShapeBorder? shape;
- final double? toolbarHeight;
- final double? leadingWidth;
+ final ShapeBorder shape;
+ final double toolbarHeight;
+ final double leadingWidth;
final double _bottomHeight;
@@ -875,13 +878,13 @@
final TickerProvider vsync;
@override
- final FloatingHeaderSnapConfiguration? snapConfiguration;
+ final FloatingHeaderSnapConfiguration snapConfiguration;
@override
- final OverScrollHeaderStretchConfiguration? stretchConfiguration;
+ final OverScrollHeaderStretchConfiguration stretchConfiguration;
@override
- final PersistentHeaderShowOnScreenConfiguration? showOnScreenConfiguration;
+ final PersistentHeaderShowOnScreenConfiguration showOnScreenConfiguration;
@override
Widget build(BuildContext context, double shrinkOffset, bool overlapsContent) {
@@ -891,7 +894,7 @@
final bool isPinnedWithOpacityFade = pinned && floating && bottom != null && extraToolbarHeight == 0.0;
final double toolbarOpacity = !pinned || isPinnedWithOpacityFade
- ? (visibleToolbarHeight / (toolbarHeight ?? kToolbarHeight)).clamp(0.0, 1.0)
+ ? (visibleToolbarHeight / (toolbarHeight ?? kToolbarHeight)).clamp(0.0, 1.0) as double
: 1.0;
final Widget appBar = FlexibleSpaceBar.createSettings(
@@ -921,7 +924,7 @@
titleSpacing: titleSpacing,
shape: shape,
toolbarOpacity: toolbarOpacity,
- bottomOpacity: pinned ? 1.0 : ((visibleMainHeight / _bottomHeight).clamp(0.0, 1.0)),
+ bottomOpacity: pinned ? 1.0 : ((visibleMainHeight / _bottomHeight).clamp(0.0, 1.0) as double),
toolbarHeight: toolbarHeight,
leadingWidth: leadingWidth,
),
@@ -1051,7 +1054,7 @@
/// The arguments [forceElevated], [primary], [floating], [pinned], [snap]
/// and [automaticallyImplyLeading] must not be null.
const SliverAppBar({
- Key? key,
+ Key key,
this.leading,
this.automaticallyImplyLeading = true,
this.title,
@@ -1103,7 +1106,7 @@
/// [IconButton] that opens the drawer. If there's no [Drawer] and the parent
/// [Navigator] can go back, the [AppBar] will use a [BackButton] that calls
/// [Navigator.maybePop].
- final Widget? leading;
+ final Widget leading;
/// Controls whether we should try to imply the leading widget if null.
///
@@ -1116,7 +1119,7 @@
///
/// Typically a [Text] widget containing a description of the current contents
/// of the app.
- final Widget? title;
+ final Widget title;
/// Widgets to display after the [title] widget.
///
@@ -1149,7 +1152,7 @@
/// )
/// ```
/// {@end-tool}
- final List<Widget>? actions;
+ final List<Widget> actions;
/// This widget is stacked behind the toolbar and the tab bar. It's height will
/// be the same as the app bar's overall height.
@@ -1158,7 +1161,7 @@
/// must be large enough to accommodate the [SliverAppBar.flexibleSpace] widget.
///
/// Typically a [FlexibleSpaceBar]. See [FlexibleSpaceBar] for details.
- final Widget? flexibleSpace;
+ final Widget flexibleSpace;
/// This widget appears across the bottom of the app bar.
///
@@ -1168,7 +1171,7 @@
/// See also:
///
/// * [PreferredSize], which can be used to give an arbitrary widget a preferred size.
- final PreferredSizeWidget? bottom;
+ final PreferredSizeWidget bottom;
/// The z-coordinate at which to place this app bar when it is above other
/// content. This controls the size of the shadow below the app bar.
@@ -1181,7 +1184,7 @@
/// no content underneath it. For example, if the app bar is [pinned] but no
/// content is scrolled under it, or if it scrolls with the content, then no
/// shadow is drawn, regardless of the value of [elevation].
- final double? elevation;
+ final double elevation;
/// The color to paint the shadow below the app bar. Typically this should be set
/// along with [elevation].
@@ -1189,7 +1192,7 @@
/// If this property is null, then [AppBarTheme.shadowColor] of
/// [ThemeData.appBarTheme] is used, if that is also null, the default value
/// is fully opaque black.
- final Color? shadowColor;
+ final Color shadowColor;
/// Whether to show the shadow appropriate for the [elevation] even if the
/// content is not scrolled under the [AppBar].
@@ -1208,7 +1211,7 @@
/// If this property is null, then [AppBarTheme.color] of
/// [ThemeData.appBarTheme] is used. If that is also null, then
/// [ThemeData.primaryColor] is used.
- final Color? backgroundColor;
+ final Color backgroundColor;
/// The brightness of the app bar's material. Typically this is set along
/// with [backgroundColor], [iconTheme], [textTheme].
@@ -1216,7 +1219,7 @@
/// If this property is null, then [AppBarTheme.brightness] of
/// [ThemeData.appBarTheme] is used. If that is also null, then
/// [ThemeData.primaryColorBrightness] is used.
- final Brightness? brightness;
+ final Brightness brightness;
/// The color, opacity, and size to use for app bar icons. Typically this
/// is set along with [backgroundColor], [brightness], [textTheme].
@@ -1224,7 +1227,7 @@
/// If this property is null, then [AppBarTheme.iconTheme] of
/// [ThemeData.appBarTheme] is used, if that is also null, then
/// [ThemeData.primaryIconTheme] is used.
- final IconThemeData? iconTheme;
+ final IconThemeData iconTheme;
/// The color, opacity, and size to use for trailing app bar icons. This
/// should only be used when the trailing icons should be themed differently
@@ -1233,7 +1236,7 @@
/// If this property is null, then [AppBarTheme.actionsIconTheme] of
/// [ThemeData.appBarTheme] is used, if that is also null, then this falls
/// back to [iconTheme].
- final IconThemeData? actionsIconTheme;
+ final IconThemeData actionsIconTheme;
/// The typographic styles to use for text in the app bar. Typically this is
/// set along with [brightness] [backgroundColor], [iconTheme].
@@ -1241,7 +1244,7 @@
/// If this property is null, then [AppBarTheme.textTheme] of
/// [ThemeData.appBarTheme] is used, if that is also null, then
/// [ThemeData.primaryTextTheme] is used.
- final TextTheme? textTheme;
+ final TextTheme textTheme;
/// Whether this app bar is being displayed at the top of the screen.
///
@@ -1252,7 +1255,7 @@
/// Whether the title should be centered.
///
/// Defaults to being adapted to the current [TargetPlatform].
- final bool? centerTitle;
+ final bool centerTitle;
/// Whether the title should be wrapped with header [Semantics].
///
@@ -1276,7 +1279,7 @@
/// If [pinned] and [floating] are true, with [bottom] set, the default
/// collapsed height is only the height of [PreferredSizeWidget.preferredSize]
/// with the [MediaQuery] top padding.
- final double? collapsedHeight;
+ final double collapsedHeight;
/// The size of the app bar when it is fully expanded.
///
@@ -1286,7 +1289,7 @@
///
/// This does not include the status bar height (which will be automatically
/// included if [primary] is true).
- final double? expandedHeight;
+ final double expandedHeight;
/// Whether the app bar should become visible as soon as the user scrolls
/// towards the app bar.
@@ -1338,7 +1341,7 @@
/// The material's shape as well as its shadow.
///
/// A shadow is only displayed if the [elevation] is greater than zero.
- final ShapeBorder? shape;
+ final ShapeBorder shape;
/// If [snap] and [floating] are true then the floating app bar will "snap"
/// into view.
@@ -1385,7 +1388,7 @@
/// The callback function to be executed when a user over-scrolls to the
/// offset specified by [stretchTriggerOffset].
- final AsyncCallback? onStretchTrigger;
+ final AsyncCallback onStretchTrigger;
/// Defines the height of the toolbar component of an [AppBar].
///
@@ -1395,7 +1398,7 @@
/// Defines the width of [leading] widget.
///
/// By default, the value of `leadingWidth` is 56.0.
- final double? leadingWidth;
+ final double leadingWidth;
@override
_SliverAppBarState createState() => _SliverAppBarState();
@@ -1404,9 +1407,9 @@
// This class is only Stateful because it owns the TickerProvider used
// by the floating appbar snap animation (via FloatingHeaderSnapConfiguration).
class _SliverAppBarState extends State<SliverAppBar> with TickerProviderStateMixin {
- FloatingHeaderSnapConfiguration? _snapConfiguration;
- OverScrollHeaderStretchConfiguration? _stretchConfiguration;
- PersistentHeaderShowOnScreenConfiguration? _showOnScreenConfiguration;
+ FloatingHeaderSnapConfiguration _snapConfiguration;
+ OverScrollHeaderStretchConfiguration _stretchConfiguration;
+ PersistentHeaderShowOnScreenConfiguration _showOnScreenConfiguration;
void _updateSnapConfiguration() {
if (widget.snap && widget.floating) {
@@ -1453,8 +1456,8 @@
@override
Widget build(BuildContext context) {
assert(!widget.primary || debugCheckHasMediaQuery(context));
- final double bottomHeight = widget.bottom?.preferredSize.height ?? 0.0;
- final double topPadding = widget.primary ? MediaQuery.of(context)!.padding.top : 0.0;
+ final double bottomHeight = widget.bottom?.preferredSize?.height ?? 0.0;
+ final double topPadding = widget.primary ? MediaQuery.of(context).padding.top : 0.0;
final double collapsedHeight = (widget.pinned && widget.floating && widget.bottom != null)
? (widget.collapsedHeight ?? 0.0) + bottomHeight + topPadding
: (widget.collapsedHeight ?? widget.toolbarHeight) + bottomHeight + topPadding;
@@ -1506,7 +1509,7 @@
// center it within its (NavigationToolbar) parent, and allow the
// parent to constrain the title's actual height.
class _AppBarTitleBox extends SingleChildRenderObjectWidget {
- const _AppBarTitleBox({ Key? key, required Widget child }) : assert(child != null), super(key: key, child: child);
+ const _AppBarTitleBox({ Key key, @required Widget child }) : assert(child != null), super(key: key, child: child);
@override
_RenderAppBarTitleBox createRenderObject(BuildContext context) {
@@ -1523,15 +1526,16 @@
class _RenderAppBarTitleBox extends RenderAligningShiftedBox {
_RenderAppBarTitleBox({
- RenderBox? child,
- TextDirection? textDirection,
+ RenderBox child,
+ TextDirection textDirection,
}) : super(child: child, alignment: Alignment.center, textDirection: textDirection);
@override
void performLayout() {
+ final BoxConstraints constraints = this.constraints;
final BoxConstraints innerConstraints = constraints.copyWith(maxHeight: double.infinity);
- child!.layout(innerConstraints, parentUsesSize: true);
- size = constraints.constrain(child!.size);
+ child.layout(innerConstraints, parentUsesSize: true);
+ size = constraints.constrain(child.size);
alignChild();
}
}
diff --git a/packages/flutter/lib/src/material/app_bar_theme.dart b/packages/flutter/lib/src/material/app_bar_theme.dart
index dd40056..5529513 100644
--- a/packages/flutter/lib/src/material/app_bar_theme.dart
+++ b/packages/flutter/lib/src/material/app_bar_theme.dart
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// @dart = 2.8
+
import 'dart:ui' show lerpDouble;
import 'package:flutter/foundation.dart';
@@ -44,54 +46,54 @@
/// Default value for [AppBar.brightness].
///
/// If null, [AppBar] uses [ThemeData.primaryColorBrightness].
- final Brightness? brightness;
+ final Brightness brightness;
/// Default value for [AppBar.backgroundColor].
///
/// If null, [AppBar] uses [ThemeData.primaryColor].
- final Color? color;
+ final Color color;
/// Default value for [AppBar.elevation].
///
/// If null, [AppBar] uses a default value of 4.0.
- final double? elevation;
+ final double elevation;
/// Default value for [AppBar.shadowColor].
///
/// If null, [AppBar] uses a default value of fully opaque black.
- final Color? shadowColor;
+ final Color shadowColor;
/// Default value for [AppBar.iconTheme].
///
/// If null, [AppBar] uses [ThemeData.primaryIconTheme].
- final IconThemeData? iconTheme;
+ final IconThemeData iconTheme;
/// Default value for [AppBar.actionsIconTheme].
///
/// If null, [AppBar] uses [ThemeData.primaryIconTheme].
- final IconThemeData? actionsIconTheme;
+ final IconThemeData actionsIconTheme;
/// Default value for [AppBar.textTheme].
///
/// If null, [AppBar] uses [ThemeData.primaryTextTheme].
- final TextTheme? textTheme;
+ final TextTheme textTheme;
/// Default value for [AppBar.centerTitle].
///
/// If null, the value is adapted to current [TargetPlatform].
- final bool? centerTitle;
+ final bool centerTitle;
/// Creates a copy of this object with the given fields replaced with the
/// new values.
AppBarTheme copyWith({
- IconThemeData? actionsIconTheme,
- Brightness? brightness,
- Color? color,
- double? elevation,
- Color? shadowColor,
- IconThemeData? iconTheme,
- TextTheme? textTheme,
- bool? centerTitle,
+ IconThemeData actionsIconTheme,
+ Brightness brightness,
+ Color color,
+ double elevation,
+ Color shadowColor,
+ IconThemeData iconTheme,
+ TextTheme textTheme,
+ bool centerTitle,
}) {
return AppBarTheme(
brightness: brightness ?? this.brightness,
@@ -107,7 +109,7 @@
/// The [ThemeData.appBarTheme] property of the ambient [Theme].
static AppBarTheme of(BuildContext context) {
- return Theme.of(context)!.appBarTheme;
+ return Theme.of(context).appBarTheme;
}
/// Linearly interpolate between two AppBar themes.
@@ -115,7 +117,7 @@
/// The argument `t` must not be null.
///
/// {@macro dart.ui.shadow.lerp}
- static AppBarTheme lerp(AppBarTheme? a, AppBarTheme? b, double t) {
+ static AppBarTheme lerp(AppBarTheme a, AppBarTheme b, double t) {
assert(t != null);
return AppBarTheme(
brightness: t < 0.5 ? a?.brightness : b?.brightness,
diff --git a/packages/flutter/lib/src/material/back_button.dart b/packages/flutter/lib/src/material/back_button.dart
index 75cc24a..20f944e 100644
--- a/packages/flutter/lib/src/material/back_button.dart
+++ b/packages/flutter/lib/src/material/back_button.dart
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// @dart = 2.8
+
import 'package:flutter/widgets.dart';
import 'debug.dart';
@@ -25,7 +27,7 @@
class BackButtonIcon extends StatelessWidget {
/// Creates an icon that shows the appropriate "back" image for
/// the current platform (as obtained from the [Theme]).
- const BackButtonIcon({ Key? key }) : super(key: key);
+ const BackButtonIcon({ Key key }) : super(key: key);
/// Returns the appropriate "back" icon for the given `platform`.
static IconData _getIconData(TargetPlatform platform) {
@@ -39,10 +41,12 @@
case TargetPlatform.macOS:
return Icons.arrow_back_ios;
}
+ assert(false);
+ return null;
}
@override
- Widget build(BuildContext context) => Icon(_getIconData(Theme.of(context)!.platform));
+ Widget build(BuildContext context) => Icon(_getIconData(Theme.of(context).platform));
}
/// A material design back button.
@@ -74,13 +78,13 @@
class BackButton extends StatelessWidget {
/// Creates an [IconButton] with the appropriate "back" icon for the current
/// target platform.
- const BackButton({ Key? key, this.color, this.onPressed }) : super(key: key);
+ const BackButton({ Key key, this.color, this.onPressed }) : super(key: key);
/// The color to use for the icon.
///
/// Defaults to the [IconThemeData.color] specified in the ambient [IconTheme],
/// which usually matches the ambient [Theme]'s [ThemeData.iconTheme].
- final Color? color;
+ final Color color;
/// An override callback to perform instead of the default behavior which is
/// to pop the [Navigator].
@@ -90,7 +94,7 @@
/// situations.
///
/// Defaults to null.
- final VoidCallback? onPressed;
+ final VoidCallback onPressed;
@override
Widget build(BuildContext context) {
@@ -98,10 +102,10 @@
return IconButton(
icon: const BackButtonIcon(),
color: color,
- tooltip: MaterialLocalizations.of(context)!.backButtonTooltip,
+ tooltip: MaterialLocalizations.of(context).backButtonTooltip,
onPressed: () {
if (onPressed != null) {
- onPressed!();
+ onPressed();
} else {
Navigator.maybePop(context);
}
@@ -128,13 +132,13 @@
/// * [IconButton], to create other material design icon buttons.
class CloseButton extends StatelessWidget {
/// Creates a Material Design close button.
- const CloseButton({ Key? key, this.color, this.onPressed }) : super(key: key);
+ const CloseButton({ Key key, this.color, this.onPressed }) : super(key: key);
/// The color to use for the icon.
///
/// Defaults to the [IconThemeData.color] specified in the ambient [IconTheme],
/// which usually matches the ambient [Theme]'s [ThemeData.iconTheme].
- final Color? color;
+ final Color color;
/// An override callback to perform instead of the default behavior which is
/// to pop the [Navigator].
@@ -144,7 +148,7 @@
/// situations.
///
/// Defaults to null.
- final VoidCallback? onPressed;
+ final VoidCallback onPressed;
@override
Widget build(BuildContext context) {
@@ -152,10 +156,10 @@
return IconButton(
icon: const Icon(Icons.close),
color: color,
- tooltip: MaterialLocalizations.of(context)!.closeButtonTooltip,
+ tooltip: MaterialLocalizations.of(context).closeButtonTooltip,
onPressed: () {
if (onPressed != null) {
- onPressed!();
+ onPressed();
} else {
Navigator.maybePop(context);
}
diff --git a/packages/flutter/lib/src/material/banner.dart b/packages/flutter/lib/src/material/banner.dart
index 45b961c..ab6babd 100644
--- a/packages/flutter/lib/src/material/banner.dart
+++ b/packages/flutter/lib/src/material/banner.dart
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// @dart = 2.8
+
import 'package:flutter/widgets.dart';
import 'banner_theme.dart';
@@ -33,10 +35,10 @@
/// The [actions], [content], and [forceActionsBelow] must be non-null.
/// The [actions.length] must be greater than 0.
const MaterialBanner({
- Key? key,
- required this.content,
+ Key key,
+ @required this.content,
this.contentTextStyle,
- required this.actions,
+ @required this.actions,
this.leading,
this.backgroundColor,
this.padding,
@@ -56,7 +58,7 @@
///
/// If `null`, [MaterialBannerThemeData.contentTextStyle] is used. If that is
/// also `null`, [TextTheme.bodyText2] of [ThemeData.textTheme] is used.
- final TextStyle? contentTextStyle;
+ final TextStyle contentTextStyle;
/// The set of actions that are displayed at the bottom or trailing side of
/// the [MaterialBanner].
@@ -67,13 +69,13 @@
/// The (optional) leading widget of the [MaterialBanner].
///
/// Typically an [Icon] widget.
- final Widget? leading;
+ final Widget leading;
/// The color of the surface of this [MaterialBanner].
///
/// If `null`, [MaterialBannerThemeData.backgroundColor] is used. If that is
/// also `null`, [ColorScheme.surface] of [ThemeData.colorScheme] is used.
- final Color? backgroundColor;
+ final Color backgroundColor;
/// The amount of space by which to inset the [content].
///
@@ -82,12 +84,12 @@
///
/// If the [actions] are trailing the [content], this defaults to
/// `EdgeInsetsDirectional.only(start: 16.0, top: 2.0)`.
- final EdgeInsetsGeometry? padding;
+ final EdgeInsetsGeometry padding;
/// The amount of space by which to inset the [leading] widget.
///
/// This defaults to `EdgeInsetsDirectional.only(end: 16.0)`.
- final EdgeInsetsGeometry? leadingPadding;
+ final EdgeInsetsGeometry leadingPadding;
/// An override to force the [actions] to be below the [content] regardless of
/// how many there are.
@@ -102,7 +104,7 @@
Widget build(BuildContext context) {
assert(actions.isNotEmpty);
- final ThemeData? theme = Theme.of(context);
+ final ThemeData theme = Theme.of(context);
final MaterialBannerThemeData bannerTheme = MaterialBannerTheme.of(context);
final bool isSingleRow = actions.length == 1 && !forceActionsBelow;
@@ -125,10 +127,10 @@
final Color backgroundColor = this.backgroundColor
?? bannerTheme.backgroundColor
- ?? theme!.colorScheme.surface;
- final TextStyle? textStyle = contentTextStyle
+ ?? theme.colorScheme.surface;
+ final TextStyle textStyle = contentTextStyle
?? bannerTheme.contentTextStyle
- ?? theme!.textTheme.bodyText2;
+ ?? theme.textTheme.bodyText2;
return Container(
color: backgroundColor,
diff --git a/packages/flutter/lib/src/material/banner_theme.dart b/packages/flutter/lib/src/material/banner_theme.dart
index feab15d..7911621 100644
--- a/packages/flutter/lib/src/material/banner_theme.dart
+++ b/packages/flutter/lib/src/material/banner_theme.dart
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// @dart = 2.8
+
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
@@ -36,25 +38,25 @@
});
/// The background color of a [MaterialBanner].
- final Color? backgroundColor;
+ final Color backgroundColor;
/// Used to configure the [DefaultTextStyle] for the [MaterialBanner.content]
/// widget.
- final TextStyle? contentTextStyle;
+ final TextStyle contentTextStyle;
/// The amount of space by which to inset [MaterialBanner.content].
- final EdgeInsetsGeometry? padding;
+ final EdgeInsetsGeometry padding;
/// The amount of space by which to inset [MaterialBanner.leading].
- final EdgeInsetsGeometry? leadingPadding;
+ final EdgeInsetsGeometry leadingPadding;
/// Creates a copy of this object with the given fields replaced with the
/// new values.
MaterialBannerThemeData copyWith({
- Color? backgroundColor,
- TextStyle? contentTextStyle,
- EdgeInsetsGeometry? padding,
- EdgeInsetsGeometry? leadingPadding,
+ Color backgroundColor,
+ TextStyle contentTextStyle,
+ EdgeInsetsGeometry padding,
+ EdgeInsetsGeometry leadingPadding,
}) {
return MaterialBannerThemeData(
backgroundColor: backgroundColor ?? this.backgroundColor,
@@ -69,7 +71,7 @@
/// The argument `t` must not be null.
///
/// {@macro dart.ui.shadow.lerp}
- static MaterialBannerThemeData lerp(MaterialBannerThemeData? a, MaterialBannerThemeData? b, double t) {
+ static MaterialBannerThemeData lerp(MaterialBannerThemeData a, MaterialBannerThemeData b, double t) {
assert(t != null);
return MaterialBannerThemeData(
backgroundColor: Color.lerp(a?.backgroundColor, b?.backgroundColor, t),
@@ -121,13 +123,13 @@
/// Creates a banner theme that controls the configurations for
/// [MaterialBanner]s in its widget subtree.
const MaterialBannerTheme({
- Key? key,
+ Key key,
this.data,
- required Widget child,
+ Widget child,
}) : super(key: key, child: child);
/// The properties for descendant [MaterialBanner] widgets.
- final MaterialBannerThemeData? data;
+ final MaterialBannerThemeData data;
/// The closest instance of this class's [data] value that encloses the given
/// context.
@@ -141,13 +143,13 @@
/// MaterialBannerThemeData theme = MaterialBannerTheme.of(context);
/// ```
static MaterialBannerThemeData of(BuildContext context) {
- final MaterialBannerTheme? bannerTheme = context.dependOnInheritedWidgetOfExactType<MaterialBannerTheme>();
- return bannerTheme?.data ?? Theme.of(context)!.bannerTheme;
+ final MaterialBannerTheme bannerTheme = context.dependOnInheritedWidgetOfExactType<MaterialBannerTheme>();
+ return bannerTheme?.data ?? Theme.of(context).bannerTheme;
}
@override
Widget wrap(BuildContext context, Widget child) {
- final MaterialBannerTheme? ancestorTheme = context.findAncestorWidgetOfExactType<MaterialBannerTheme>();
+ final MaterialBannerTheme ancestorTheme = context.findAncestorWidgetOfExactType<MaterialBannerTheme>();
return identical(this, ancestorTheme) ? child : MaterialBannerTheme(data: data, child: child);
}
diff --git a/packages/flutter/lib/src/material/bottom_app_bar.dart b/packages/flutter/lib/src/material/bottom_app_bar.dart
index 8fe8ef2..066c984 100644
--- a/packages/flutter/lib/src/material/bottom_app_bar.dart
+++ b/packages/flutter/lib/src/material/bottom_app_bar.dart
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// @dart = 2.8
+
import 'package:flutter/foundation.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart';
@@ -48,7 +50,7 @@
/// If the corresponding [BottomAppBarTheme] property is null, then the default
/// specified in the property's documentation will be used.
const BottomAppBar({
- Key? key,
+ Key key,
this.color,
this.elevation,
this.shape,
@@ -66,14 +68,14 @@
///
/// Typically this the child will be a [Row], with the first child
/// being an [IconButton] with the [Icons.menu] icon.
- final Widget? child;
+ final Widget child;
/// The bottom app bar's background color.
///
/// If this property is null then [BottomAppBarTheme.color] of
/// [ThemeData.bottomAppBarTheme] is used. If that's null then
/// [ThemeData.bottomAppBarColor] is used.
- final Color? color;
+ final Color color;
/// The z-coordinate at which to place this bottom app bar relative to its
/// parent.
@@ -84,14 +86,14 @@
/// If this property is null then [BottomAppBarTheme.elevation] of
/// [ThemeData.bottomAppBarTheme] is used. If that's null, the default value
/// is 8.
- final double? elevation;
+ final double elevation;
/// The notch that is made for the floating action button.
///
/// If this property is null then [BottomAppBarTheme.shape] of
/// [ThemeData.bottomAppBarTheme] is used. If that's null then the shape will
/// be rectangular with no notch.
- final NotchedShape? shape;
+ final NotchedShape shape;
/// {@macro flutter.widgets.Clip}
///
@@ -109,19 +111,19 @@
}
class _BottomAppBarState extends State<BottomAppBar> {
- late ValueListenable<ScaffoldGeometry> geometryListenable;
+ ValueListenable<ScaffoldGeometry> geometryListenable;
static const double _defaultElevation = 8.0;
@override
void didChangeDependencies() {
super.didChangeDependencies();
- geometryListenable = Scaffold.geometryOf(context)!;
+ geometryListenable = Scaffold.geometryOf(context);
}
@override
Widget build(BuildContext context) {
final BottomAppBarTheme babTheme = BottomAppBarTheme.of(context);
- final NotchedShape? notchedShape = widget.shape ?? babTheme.shape;
+ final NotchedShape notchedShape = widget.shape ?? babTheme.shape;
final CustomClipper<Path> clipper = notchedShape != null
? _BottomAppBarClipper(
geometry: geometryListenable,
@@ -130,7 +132,7 @@
)
: const ShapeBorderClipper(shape: RoundedRectangleBorder());
final double elevation = widget.elevation ?? babTheme.elevation ?? _defaultElevation;
- final Color color = widget.color ?? babTheme.color ?? Theme.of(context)!.bottomAppBarColor;
+ final Color color = widget.color ?? babTheme.color ?? Theme.of(context).bottomAppBarColor;
final Color effectiveColor = ElevationOverlay.applyOverlay(context, color, elevation);
return PhysicalShape(
clipper: clipper,
@@ -141,7 +143,7 @@
type: MaterialType.transparency,
child: widget.child == null
? null
- : SafeArea(child: widget.child!),
+ : SafeArea(child: widget.child),
),
);
}
@@ -149,9 +151,9 @@
class _BottomAppBarClipper extends CustomClipper<Path> {
const _BottomAppBarClipper({
- required this.geometry,
- required this.shape,
- required this.notchMargin,
+ @required this.geometry,
+ @required this.shape,
+ @required this.notchMargin,
}) : assert(geometry != null),
assert(shape != null),
assert(notchMargin != null),
@@ -166,9 +168,9 @@
// button is the floating action button's bounding rectangle in the
// coordinate system whose origin is at the appBar's top left corner,
// or null if there is no floating action button.
- final Rect? button = geometry.value.floatingActionButtonArea?.translate(
+ final Rect button = geometry.value.floatingActionButtonArea?.translate(
0.0,
- geometry.value.bottomNavigationBarTop! * -1.0,
+ geometry.value.bottomNavigationBarTop * -1.0,
);
return shape.getOuterPath(Offset.zero & size, button?.inflate(notchMargin));
}
diff --git a/packages/flutter/lib/src/material/bottom_app_bar_theme.dart b/packages/flutter/lib/src/material/bottom_app_bar_theme.dart
index 1612b41..93683bf 100644
--- a/packages/flutter/lib/src/material/bottom_app_bar_theme.dart
+++ b/packages/flutter/lib/src/material/bottom_app_bar_theme.dart
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// @dart = 2.8
+
import 'dart:ui' show lerpDouble;
import 'package:flutter/foundation.dart';
@@ -37,20 +39,20 @@
/// Default value for [BottomAppBar.color].
///
/// If null, [BottomAppBar] uses [ThemeData.bottomAppBarColor].
- final Color? color;
+ final Color color;
/// Default value for [BottomAppBar.elevation].
- final double? elevation;
+ final double elevation;
/// Default value for [BottomAppBar.shape].
- final NotchedShape? shape;
+ final NotchedShape shape;
/// Creates a copy of this object but with the given fields replaced with the
/// new values.
BottomAppBarTheme copyWith({
- Color? color,
- double? elevation,
- NotchedShape? shape,
+ Color color,
+ double elevation,
+ NotchedShape shape,
}) {
return BottomAppBarTheme(
color: color ?? this.color,
@@ -61,7 +63,7 @@
/// The [ThemeData.bottomAppBarTheme] property of the ambient [Theme].
static BottomAppBarTheme of(BuildContext context) {
- return Theme.of(context)!.bottomAppBarTheme;
+ return Theme.of(context).bottomAppBarTheme;
}
/// Linearly interpolate between two BAB themes.
@@ -69,7 +71,7 @@
/// The argument `t` must not be null.
///
/// {@macro dart.ui.shadow.lerp}
- static BottomAppBarTheme lerp(BottomAppBarTheme? a, BottomAppBarTheme? b, double t) {
+ static BottomAppBarTheme lerp(BottomAppBarTheme a, BottomAppBarTheme b, double t) {
assert(t != null);
return BottomAppBarTheme(
color: Color.lerp(a?.color, b?.color, t),
diff --git a/packages/flutter/lib/src/material/bottom_navigation_bar.dart b/packages/flutter/lib/src/material/bottom_navigation_bar.dart
index f4cad60..faf8965 100644
--- a/packages/flutter/lib/src/material/bottom_navigation_bar.dart
+++ b/packages/flutter/lib/src/material/bottom_navigation_bar.dart
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// @dart = 2.8
+
import 'dart:collection' show Queue;
import 'dart:math' as math;
@@ -170,16 +172,16 @@
/// [BottomNavigationBarType.fixed] and `false` if [type] is
/// [BottomNavigationBarType.shifting].
BottomNavigationBar({
- Key? key,
- required this.items,
+ Key key,
+ @required this.items,
this.onTap,
this.currentIndex = 0,
this.elevation,
this.type,
- Color? fixedColor,
+ Color fixedColor,
this.backgroundColor,
this.iconSize = 24.0,
- Color? selectedItemColor,
+ Color selectedItemColor,
this.unselectedItemColor,
this.selectedIconTheme,
this.unselectedIconTheme,
@@ -219,7 +221,7 @@
/// The stateful widget that creates the bottom navigation bar needs to keep
/// track of the index of the selected [BottomNavigationBarItem] and call
/// `setState` to rebuild the bottom navigation bar with the new [currentIndex].
- final ValueChanged<int>? onTap;
+ final ValueChanged<int> onTap;
/// The index into [items] for the current active [BottomNavigationBarItem].
final int currentIndex;
@@ -229,26 +231,26 @@
/// If null, defaults to `8.0`.
///
/// {@macro flutter.material.material.elevation}
- final double? elevation;
+ final double elevation;
/// Defines the layout and behavior of a [BottomNavigationBar].
///
/// See documentation for [BottomNavigationBarType] for information on the
/// meaning of different types.
- final BottomNavigationBarType? type;
+ final BottomNavigationBarType type;
/// The value of [selectedItemColor].
///
/// This getter only exists for backwards compatibility, the
/// [selectedItemColor] property is preferred.
- Color? get fixedColor => selectedItemColor;
+ Color get fixedColor => selectedItemColor;
/// The color of the [BottomNavigationBar] itself.
///
/// If [type] is [BottomNavigationBarType.shifting] and the
/// [items] have [BottomNavigationBarItem.backgroundColor] set, the [items]'
/// backgroundColor will splash and overwrite this color.
- final Color? backgroundColor;
+ final Color backgroundColor;
/// The size of all of the [BottomNavigationBarItem] icons.
///
@@ -259,13 +261,13 @@
/// [BottomNavigationBarItem.title].
///
/// If null then the [ThemeData.primaryColor] is used.
- final Color? selectedItemColor;
+ final Color selectedItemColor;
/// The color of the unselected [BottomNavigationBarItem.icon] and
/// [BottomNavigationBarItem.title]s.
///
/// If null then the [TextTheme.caption]'s color is used.
- final Color? unselectedItemColor;
+ final Color unselectedItemColor;
/// The size, opacity, and color of the icon in the currently selected
/// [BottomNavigationBarItem.icon].
@@ -276,7 +278,7 @@
/// It this field is provided, it must contain non-null [IconThemeData.size]
/// and [IconThemeData.color] properties. Also, if this field is supplied,
/// [unselectedIconTheme] must be provided.
- final IconThemeData? selectedIconTheme;
+ final IconThemeData selectedIconTheme;
/// The size, opacity, and color of the icon in the currently unselected
/// [BottomNavigationBarItem.icon]s.
@@ -287,15 +289,15 @@
/// It this field is provided, it must contain non-null [IconThemeData.size]
/// and [IconThemeData.color] properties. Also, if this field is supplied,
/// [unselectedIconTheme] must be provided.
- final IconThemeData? unselectedIconTheme;
+ final IconThemeData unselectedIconTheme;
/// The [TextStyle] of the [BottomNavigationBarItem] labels when they are
/// selected.
- final TextStyle? selectedLabelStyle;
+ final TextStyle selectedLabelStyle;
/// The [TextStyle] of the [BottomNavigationBarItem] labels when they are not
/// selected.
- final TextStyle? unselectedLabelStyle;
+ final TextStyle unselectedLabelStyle;
/// The font size of the [BottomNavigationBarItem] labels when they are selected.
///
@@ -315,7 +317,7 @@
final double unselectedFontSize;
/// Whether the labels are shown for the selected [BottomNavigationBarItem].
- final bool? showUnselectedLabels;
+ final bool showUnselectedLabels;
/// Whether the labels are shown for the unselected [BottomNavigationBarItem]s.
final bool showSelectedLabels;
@@ -324,7 +326,7 @@
/// tiles.
///
/// If this property is null, [SystemMouseCursors.click] will be used.
- final MouseCursor? mouseCursor;
+ final MouseCursor mouseCursor;
@override
_BottomNavigationBarState createState() => _BottomNavigationBarState();
@@ -342,14 +344,14 @@
this.colorTween,
this.flex,
this.selected = false,
- required this.selectedLabelStyle,
- required this.unselectedLabelStyle,
- required this.selectedIconTheme,
- required this.unselectedIconTheme,
+ @required this.selectedLabelStyle,
+ @required this.unselectedLabelStyle,
+ @required this.selectedIconTheme,
+ @required this.unselectedIconTheme,
this.showSelectedLabels,
this.showUnselectedLabels,
this.indexLabel,
- required this.mouseCursor,
+ @required this.mouseCursor,
}) : assert(type != null),
assert(item != null),
assert(animation != null),
@@ -362,17 +364,17 @@
final BottomNavigationBarItem item;
final Animation<double> animation;
final double iconSize;
- final VoidCallback? onTap;
- final ColorTween? colorTween;
- final double? flex;
+ final VoidCallback onTap;
+ final ColorTween colorTween;
+ final double flex;
final bool selected;
- final IconThemeData? selectedIconTheme;
- final IconThemeData? unselectedIconTheme;
+ final IconThemeData selectedIconTheme;
+ final IconThemeData unselectedIconTheme;
final TextStyle selectedLabelStyle;
final TextStyle unselectedLabelStyle;
- final String? indexLabel;
- final bool? showSelectedLabels;
- final bool? showUnselectedLabels;
+ final String indexLabel;
+ final bool showSelectedLabels;
+ final bool showUnselectedLabels;
final MouseCursor mouseCursor;
@override
@@ -385,13 +387,13 @@
final BottomNavigationBarThemeData bottomTheme = BottomNavigationBarTheme.of(context);
- final double selectedFontSize = selectedLabelStyle.fontSize!;
+ final double selectedFontSize = selectedLabelStyle.fontSize;
final double selectedIconSize = selectedIconTheme?.size
- ?? bottomTheme.selectedIconTheme?.size
+ ?? bottomTheme?.selectedIconTheme?.size
?? iconSize;
final double unselectedIconSize = unselectedIconTheme?.size
- ?? bottomTheme.unselectedIconTheme?.size
+ ?? bottomTheme?.unselectedIconTheme?.size
?? iconSize;
// The amount that the selected icon is bigger than the unselected icons,
@@ -420,7 +422,7 @@
// =======
double bottomPadding;
double topPadding;
- if (showSelectedLabels! && !showUnselectedLabels!) {
+ if (showSelectedLabels && !showUnselectedLabels) {
bottomPadding = Tween<double>(
begin: selectedIconDiff / 2.0,
end: selectedFontSize / 2.0 - unselectedIconDiff / 2.0,
@@ -429,7 +431,7 @@
begin: selectedFontSize + selectedIconDiff / 2.0,
end: selectedFontSize / 2.0 - unselectedIconDiff / 2.0,
).evaluate(animation);
- } else if (!showSelectedLabels! && !showUnselectedLabels!) {
+ } else if (!showSelectedLabels && !showUnselectedLabels) {
bottomPadding = Tween<double>(
begin: selectedIconDiff / 2.0,
end: unselectedIconDiff / 2.0,
@@ -454,7 +456,7 @@
size = 1;
break;
case BottomNavigationBarType.shifting:
- size = (flex! * 1000.0).round();
+ size = (flex * 1000.0).round();
break;
}
@@ -469,7 +471,7 @@
mainAxisSize: MainAxisSize.min,
children: <Widget>[
_TileIcon(
- colorTween: colorTween!,
+ colorTween: colorTween,
animation: animation,
iconSize: iconSize,
selected: selected,
@@ -478,13 +480,13 @@
unselectedIconTheme: unselectedIconTheme ?? bottomTheme.unselectedIconTheme,
),
_Label(
- colorTween: colorTween!,
+ colorTween: colorTween,
animation: animation,
item: item,
- selectedLabelStyle: selectedLabelStyle,
- unselectedLabelStyle: unselectedLabelStyle,
- showSelectedLabels: showSelectedLabels ?? bottomTheme.showUnselectedLabels!,
- showUnselectedLabels: showUnselectedLabels ?? bottomTheme.showUnselectedLabels!,
+ selectedLabelStyle: selectedLabelStyle ?? bottomTheme.selectedLabelStyle,
+ unselectedLabelStyle: unselectedLabelStyle ?? bottomTheme.unselectedLabelStyle,
+ showSelectedLabels: showSelectedLabels ?? bottomTheme.showUnselectedLabels,
+ showUnselectedLabels: showUnselectedLabels ?? bottomTheme.showUnselectedLabels,
),
],
),
@@ -493,7 +495,7 @@
if (item.label != null) {
result = Tooltip(
- message: item.label!,
+ message: item.label,
preferBelow: false,
verticalOffset: selectedIconSize + selectedFontSize,
child: result,
@@ -523,14 +525,14 @@
class _TileIcon extends StatelessWidget {
const _TileIcon({
- Key? key,
- required this.colorTween,
- required this.animation,
- required this.iconSize,
- required this.selected,
- required this.item,
- required this.selectedIconTheme,
- required this.unselectedIconTheme,
+ Key key,
+ @required this.colorTween,
+ @required this.animation,
+ @required this.iconSize,
+ @required this.selected,
+ @required this.item,
+ @required this.selectedIconTheme,
+ @required this.unselectedIconTheme,
}) : assert(selected != null),
assert(item != null),
super(key: key);
@@ -540,12 +542,12 @@
final double iconSize;
final bool selected;
final BottomNavigationBarItem item;
- final IconThemeData? selectedIconTheme;
- final IconThemeData? unselectedIconTheme;
+ final IconThemeData selectedIconTheme;
+ final IconThemeData unselectedIconTheme;
@override
Widget build(BuildContext context) {
- final Color? iconColor = colorTween.evaluate(animation);
+ final Color iconColor = colorTween.evaluate(animation);
final IconThemeData defaultIconTheme = IconThemeData(
color: iconColor,
size: iconSize,
@@ -571,14 +573,14 @@
class _Label extends StatelessWidget {
const _Label({
- Key? key,
- required this.colorTween,
- required this.animation,
- required this.item,
- required this.selectedLabelStyle,
- required this.unselectedLabelStyle,
- required this.showSelectedLabels,
- required this.showUnselectedLabels,
+ Key key,
+ @required this.colorTween,
+ @required this.animation,
+ @required this.item,
+ @required this.selectedLabelStyle,
+ @required this.unselectedLabelStyle,
+ @required this.showSelectedLabels,
+ @required this.showUnselectedLabels,
}) : assert(colorTween != null),
assert(animation != null),
assert(item != null),
@@ -598,14 +600,14 @@
@override
Widget build(BuildContext context) {
- final double? selectedFontSize = selectedLabelStyle.fontSize;
- final double? unselectedFontSize = unselectedLabelStyle.fontSize;
+ final double selectedFontSize = selectedLabelStyle.fontSize;
+ final double unselectedFontSize = unselectedLabelStyle.fontSize;
final TextStyle customStyle = TextStyle.lerp(
unselectedLabelStyle,
selectedLabelStyle,
animation.value,
- )!;
+ );
Widget text = DefaultTextStyle.merge(
style: customStyle.copyWith(
fontSize: selectedFontSize,
@@ -618,13 +620,13 @@
transform: Matrix4.diagonal3(
Vector3.all(
Tween<double>(
- begin: unselectedFontSize! / selectedFontSize!,
+ begin: unselectedFontSize / selectedFontSize,
end: 1.0,
).evaluate(animation),
),
),
alignment: Alignment.bottomCenter,
- child: item.title ?? Text(item.label!),
+ child: item.title ?? Text(item.label),
),
);
@@ -660,7 +662,7 @@
if (item.label != null) {
// Do not grow text in bottom navigation bar when we can show a tooltip
// instead.
- final MediaQueryData mediaQueryData = MediaQuery.of(context)!;
+ final MediaQueryData mediaQueryData = MediaQuery.of(context);
text = MediaQuery(
data: mediaQueryData.copyWith(
textScaleFactor: math.min(1.0, mediaQueryData.textScaleFactor),
@@ -675,14 +677,14 @@
class _BottomNavigationBarState extends State<BottomNavigationBar> with TickerProviderStateMixin {
List<AnimationController> _controllers = <AnimationController>[];
- late List<CurvedAnimation> _animations;
+ List<CurvedAnimation> _animations;
// A queue of color splashes currently being animated.
final Queue<_Circle> _circles = Queue<_Circle>();
// Last splash circle's color, and the final color of the control after
// animation is complete.
- Color? _backgroundColor;
+ Color _backgroundColor;
static final Animatable<double> _flexTween = Tween<double>(begin: 1.0, end: 1.5);
@@ -733,6 +735,8 @@
case BottomNavigationBarType.fixed:
return true;
}
+ assert(false);
+ return false;
}
@override
@@ -765,7 +769,7 @@
_Circle(
state: this,
index: index,
- color: widget.items[index].backgroundColor!,
+ color: widget.items[index].backgroundColor,
vsync: this,
)..controller.addStatusListener(
(AnimationStatus status) {
@@ -816,17 +820,17 @@
// If the given [TextStyle] has a non-null `fontSize`, it should be used.
// Otherwise, the [selectedFontSize] parameter should be used.
- static TextStyle _effectiveTextStyle(TextStyle? textStyle, double fontSize) {
+ static TextStyle _effectiveTextStyle(TextStyle textStyle, double fontSize) {
textStyle ??= const TextStyle();
// Prefer the font size on textStyle if present.
return textStyle.fontSize == null ? textStyle.copyWith(fontSize: fontSize) : textStyle;
}
List<Widget> _createTiles() {
- final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
+ final MaterialLocalizations localizations = MaterialLocalizations.of(context);
assert(localizations != null);
- final ThemeData themeData = Theme.of(context)!;
+ final ThemeData themeData = Theme.of(context);
final BottomNavigationBarThemeData bottomTheme = BottomNavigationBarTheme.of(context);
final TextStyle effectiveSelectedLabelStyle =
@@ -856,7 +860,7 @@
colorTween = ColorTween(
begin: widget.unselectedItemColor
?? bottomTheme.unselectedItemColor
- ?? themeData.textTheme.caption!.color,
+ ?? themeData.textTheme.caption.color,
end: widget.selectedItemColor
?? bottomTheme.selectedItemColor
?? widget.fixedColor
@@ -889,12 +893,12 @@
unselectedLabelStyle: effectiveUnselectedLabelStyle,
onTap: () {
if (widget.onTap != null)
- widget.onTap!(i);
+ widget.onTap(i);
},
colorTween: colorTween,
flex: _evaluateFlex(_animations[i]),
selected: i == widget.currentIndex,
- showSelectedLabels: widget.showSelectedLabels,
+ showSelectedLabels: widget.showSelectedLabels ?? bottomTheme.showSelectedLabels,
showUnselectedLabels: widget.showUnselectedLabels ?? bottomTheme.showUnselectedLabels ?? _defaultShowUnselected,
indexLabel: localizations.tabLabel(tabIndex: i + 1, tabCount: widget.items.length),
mouseCursor: effectiveMouseCursor,
@@ -923,8 +927,8 @@
final BottomNavigationBarThemeData bottomTheme = BottomNavigationBarTheme.of(context);
// Labels apply up to _bottomMargin padding. Remainder is media padding.
- final double additionalBottomPadding = math.max(MediaQuery.of(context)!.padding.bottom - widget.selectedFontSize / 2.0, 0.0);
- Color? backgroundColor;
+ final double additionalBottomPadding = math.max(MediaQuery.of(context).padding.bottom - widget.selectedFontSize / 2.0, 0.0);
+ Color backgroundColor;
switch (_effectiveType) {
case BottomNavigationBarType.fixed:
backgroundColor = widget.backgroundColor ?? bottomTheme.backgroundColor;
@@ -943,7 +947,7 @@
child: CustomPaint(
painter: _RadialPainter(
circles: _circles.toList(),
- textDirection: Directionality.of(context)!,
+ textDirection: Directionality.of(context),
),
child: Material( // Splashes.
type: MaterialType.transparency,
@@ -966,10 +970,10 @@
// Describes an animating color splash circle.
class _Circle {
_Circle({
- required this.state,
- required this.index,
- required this.color,
- required TickerProvider vsync,
+ @required this.state,
+ @required this.index,
+ @required this.color,
+ @required TickerProvider vsync,
}) : assert(state != null),
assert(index != null),
assert(color != null) {
@@ -987,8 +991,8 @@
final _BottomNavigationBarState state;
final int index;
final Color color;
- late AnimationController controller;
- late CurvedAnimation animation;
+ AnimationController controller;
+ CurvedAnimation animation;
double get horizontalLeadingOffset {
double weightSum(Iterable<Animation<double>> animations) {
@@ -1013,8 +1017,8 @@
// Paints the animating color splash circles.
class _RadialPainter extends CustomPainter {
_RadialPainter({
- required this.circles,
- required this.textDirection,
+ @required this.circles,
+ @required this.textDirection,
}) : assert(circles != null),
assert(textDirection != null);
diff --git a/packages/flutter/lib/src/material/bottom_navigation_bar_theme.dart b/packages/flutter/lib/src/material/bottom_navigation_bar_theme.dart
index 9fe4702..f914b8b 100644
--- a/packages/flutter/lib/src/material/bottom_navigation_bar_theme.dart
+++ b/packages/flutter/lib/src/material/bottom_navigation_bar_theme.dart
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// @dart = 2.8
+
import 'dart:ui' show lerpDouble;
import 'package:flutter/foundation.dart';
@@ -48,78 +50,78 @@
/// The color of the [BottomNavigationBar] itself.
///
/// See [BottomNavigationBar.backgroundColor].
- final Color? backgroundColor;
+ final Color backgroundColor;
/// The z-coordinate of the [BottomNavigationBar].
///
/// See [BottomNavigationBar.elevation].
- final double? elevation;
+ final double elevation;
/// The size, opacity, and color of the icon in the currently selected
/// [BottomNavigationBarItem.icon].
///
/// See [BottomNavigationBar.selectedIconTheme].
- final IconThemeData? selectedIconTheme;
+ final IconThemeData selectedIconTheme;
/// The size, opacity, and color of the icon in the currently unselected
/// [BottomNavigationBarItem.icon]s.
///
/// See [BottomNavigationBar.unselectedIconTheme].
- final IconThemeData? unselectedIconTheme;
+ final IconThemeData unselectedIconTheme;
/// The color of the selected [BottomNavigationBarItem.icon] and
/// [BottomNavigationBarItem.title].
///
/// See [BottomNavigationBar.selectedItemColor].
- final Color? selectedItemColor;
+ final Color selectedItemColor;
/// The color of the unselected [BottomNavigationBarItem.icon] and
/// [BottomNavigationBarItem.title]s.
///
/// See [BottomNavigationBar.unselectedItemColor].
- final Color? unselectedItemColor;
+ final Color unselectedItemColor;
/// The [TextStyle] of the [BottomNavigationBarItem] labels when they are
/// selected.
///
/// See [BottomNavigationBar.selectedLabelStyle].
- final TextStyle? selectedLabelStyle;
+ final TextStyle selectedLabelStyle;
/// The [TextStyle] of the [BottomNavigationBarItem] labels when they are not
/// selected.
///
/// See [BottomNavigationBar.unselectedLabelStyle].
- final TextStyle? unselectedLabelStyle;
+ final TextStyle unselectedLabelStyle;
/// Whether the labels are shown for the unselected [BottomNavigationBarItem]s.
///
/// See [BottomNavigationBar.showSelectedLabels].
- final bool? showSelectedLabels;
+ final bool showSelectedLabels;
/// Whether the labels are shown for the selected [BottomNavigationBarItem].
///
/// See [BottomNavigationBar.showUnselectedLabels].
- final bool? showUnselectedLabels;
+ final bool showUnselectedLabels;
/// Defines the layout and behavior of a [BottomNavigationBar].
///
/// See [BottomNavigationBar.type].
- final BottomNavigationBarType? type;
+ final BottomNavigationBarType type;
/// Creates a copy of this object but with the given fields replaced with the
/// new values.
BottomNavigationBarThemeData copyWith({
- Color? backgroundColor,
- double? elevation,
- IconThemeData? selectedIconTheme,
- IconThemeData? unselectedIconTheme,
- Color? selectedItemColor,
- Color? unselectedItemColor,
- TextStyle? selectedLabelStyle,
- TextStyle? unselectedLabelStyle,
- bool? showSelectedLabels,
- bool? showUnselectedLabels,
- BottomNavigationBarType? type,
+ Color backgroundColor,
+ double elevation,
+ IconThemeData selectedIconTheme,
+ IconThemeData unselectedIconTheme,
+ Color selectedItemColor,
+ Color unselectedItemColor,
+ TextStyle selectedLabelStyle,
+ TextStyle unselectedLabelStyle,
+ bool showSelectedLabels,
+ bool showUnselectedLabels,
+ BottomNavigationBarType type,
}) {
return BottomNavigationBarThemeData(
backgroundColor: backgroundColor ?? this.backgroundColor,
@@ -141,7 +143,7 @@
/// The argument `t` must not be null.
///
/// {@macro dart.ui.shadow.lerp}
- static BottomNavigationBarThemeData lerp(BottomNavigationBarThemeData? a, BottomNavigationBarThemeData? b, double t) {
+ static BottomNavigationBarThemeData lerp(BottomNavigationBarThemeData a, BottomNavigationBarThemeData b, double t) {
assert(t != null);
return BottomNavigationBarThemeData(
backgroundColor: Color.lerp(a?.backgroundColor, b?.backgroundColor, t),
@@ -233,9 +235,9 @@
///
/// The [data] must not be null.
const BottomNavigationBarTheme({
- Key? key,
- required this.data,
- required Widget child,
+ Key key,
+ @required this.data,
+ Widget child,
}) : assert(data != null), super(key: key, child: child);
/// The properties used for all descendant [BottomNavigationBar] widgets.
@@ -252,8 +254,8 @@
/// BottomNavigationBarThemeData theme = BottomNavigationBarTheme.of(context);
/// ```
static BottomNavigationBarThemeData of(BuildContext context) {
- final BottomNavigationBarTheme? bottomNavTheme = context.dependOnInheritedWidgetOfExactType<BottomNavigationBarTheme>();
- return bottomNavTheme?.data ?? Theme.of(context)!.bottomNavigationBarTheme;
+ final BottomNavigationBarTheme bottomNavTheme = context.dependOnInheritedWidgetOfExactType<BottomNavigationBarTheme>();
+ return bottomNavTheme?.data ?? Theme.of(context).bottomNavigationBarTheme;
}
@override
diff --git a/packages/flutter/lib/src/material/bottom_sheet.dart b/packages/flutter/lib/src/material/bottom_sheet.dart
index f8bf8cb..5bb5cb8 100644
--- a/packages/flutter/lib/src/material/bottom_sheet.dart
+++ b/packages/flutter/lib/src/material/bottom_sheet.dart
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// @dart = 2.8
+
import 'dart:ui' show lerpDouble;
import 'package:flutter/foundation.dart';
@@ -33,7 +35,7 @@
/// Used by [BottomSheet.onDragEnd].
typedef BottomSheetDragEndHandler = void Function(
DragEndDetails details, {
- required bool isClosing,
+ bool isClosing,
});
/// A material design bottom sheet.
@@ -70,7 +72,7 @@
/// [ScaffoldState.showBottomSheet], for persistent bottom sheets, or by
/// [showModalBottomSheet], for modal bottom sheets.
const BottomSheet({
- Key? key,
+ Key key,
this.animationController,
this.enableDrag = true,
this.onDragStart,
@@ -79,8 +81,8 @@
this.elevation,
this.shape,
this.clipBehavior,
- required this.onClosing,
- required this.builder,
+ @required this.onClosing,
+ @required this.builder,
}) : assert(enableDrag != null),
assert(onClosing != null),
assert(builder != null),
@@ -92,7 +94,7 @@
///
/// The BottomSheet widget will manipulate the position of this animation, it
/// is not just a passive observer.
- final AnimationController? animationController;
+ final AnimationController animationController;
/// Called when the bottom sheet begins to close.
///
@@ -118,7 +120,7 @@
///
/// Would typically be used to change the bottom sheet animation curve so
/// that it tracks the user's finger accurately.
- final BottomSheetDragStartHandler? onDragStart;
+ final BottomSheetDragStartHandler onDragStart;
/// Called when the user stops dragging the bottom sheet, if [enableDrag]
/// is true.
@@ -126,28 +128,28 @@
/// Would typically be used to reset the bottom sheet animation curve, so
/// that it animates non-linearly. Called before [onClosing] if the bottom
/// sheet is closing.
- final BottomSheetDragEndHandler? onDragEnd;
+ final BottomSheetDragEndHandler onDragEnd;
/// The bottom sheet's background color.
///
/// Defines the bottom sheet's [Material.color].
///
/// Defaults to null and falls back to [Material]'s default.
- final Color? backgroundColor;
+ final Color backgroundColor;
/// The z-coordinate at which to place this material relative to its parent.
///
/// This controls the size of the shadow below the material.
///
/// Defaults to 0. The value is non-negative.
- final double? elevation;
+ final double elevation;
/// The shape of the bottom sheet.
///
/// Defines the bottom sheet's [Material.shape].
///
/// Defaults to null and falls back to [Material]'s default.
- final ShapeBorder? shape;
+ final ShapeBorder shape;
/// {@macro flutter.widgets.Clip}
///
@@ -161,7 +163,7 @@
/// If this property is null then [BottomSheetThemeData.clipBehavior] of
/// [ThemeData.bottomSheetTheme] is used. If that's null then the behavior
/// will be [Clip.none].
- final Clip? clipBehavior;
+ final Clip clipBehavior;
@override
_BottomSheetState createState() => _BottomSheetState();
@@ -187,15 +189,15 @@
final GlobalKey _childKey = GlobalKey(debugLabel: 'BottomSheet child');
double get _childHeight {
- final RenderBox renderBox = _childKey.currentContext!.findRenderObject() as RenderBox;
+ final RenderBox renderBox = _childKey.currentContext.findRenderObject() as RenderBox;
return renderBox.size.height;
}
- bool get _dismissUnderway => widget.animationController!.status == AnimationStatus.reverse;
+ bool get _dismissUnderway => widget.animationController.status == AnimationStatus.reverse;
void _handleDragStart(DragStartDetails details) {
if (widget.onDragStart != null) {
- widget.onDragStart!(details);
+ widget.onDragStart(details);
}
}
@@ -203,7 +205,7 @@
assert(widget.enableDrag);
if (_dismissUnderway)
return;
- widget.animationController!.value -= details.primaryDelta! / _childHeight;
+ widget.animationController.value -= details.primaryDelta / (_childHeight ?? details.primaryDelta);
}
void _handleDragEnd(DragEndDetails details) {
@@ -213,22 +215,22 @@
bool isClosing = false;
if (details.velocity.pixelsPerSecond.dy > _minFlingVelocity) {
final double flingVelocity = -details.velocity.pixelsPerSecond.dy / _childHeight;
- if (widget.animationController!.value > 0.0) {
- widget.animationController!.fling(velocity: flingVelocity);
+ if (widget.animationController.value > 0.0) {
+ widget.animationController.fling(velocity: flingVelocity);
}
if (flingVelocity < 0.0) {
isClosing = true;
}
- } else if (widget.animationController!.value < _closeProgressThreshold) {
- if (widget.animationController!.value > 0.0)
- widget.animationController!.fling(velocity: -1.0);
+ } else if (widget.animationController.value < _closeProgressThreshold) {
+ if (widget.animationController.value > 0.0)
+ widget.animationController.fling(velocity: -1.0);
isClosing = true;
} else {
- widget.animationController!.forward();
+ widget.animationController.forward();
}
if (widget.onDragEnd != null) {
- widget.onDragEnd!(
+ widget.onDragEnd(
details,
isClosing: isClosing,
);
@@ -248,10 +250,10 @@
@override
Widget build(BuildContext context) {
- final BottomSheetThemeData bottomSheetTheme = Theme.of(context)!.bottomSheetTheme;
- final Color? color = widget.backgroundColor ?? bottomSheetTheme.backgroundColor;
+ final BottomSheetThemeData bottomSheetTheme = Theme.of(context).bottomSheetTheme;
+ final Color color = widget.backgroundColor ?? bottomSheetTheme.backgroundColor;
final double elevation = widget.elevation ?? bottomSheetTheme.elevation ?? 0;
- final ShapeBorder? shape = widget.shape ?? bottomSheetTheme.shape;
+ final ShapeBorder shape = widget.shape ?? bottomSheetTheme.shape;
final Clip clipBehavior = widget.clipBehavior ?? bottomSheetTheme.clipBehavior ?? Clip.none;
final Widget bottomSheet = Material(
@@ -312,7 +314,7 @@
class _ModalBottomSheet<T> extends StatefulWidget {
const _ModalBottomSheet({
- Key? key,
+ Key key,
this.route,
this.backgroundColor,
this.elevation,
@@ -324,12 +326,12 @@
assert(enableDrag != null),
super(key: key);
- final _ModalBottomSheetRoute<T>? route;
+ final _ModalBottomSheetRoute<T> route;
final bool isScrollControlled;
- final Color? backgroundColor;
- final double? elevation;
- final ShapeBorder? shape;
- final Clip? clipBehavior;
+ final Color backgroundColor;
+ final double elevation;
+ final ShapeBorder shape;
+ final Clip clipBehavior;
final bool enableDrag;
@override
@@ -340,7 +342,7 @@
ParametricCurve<double> animationCurve = _modalBottomSheetCurve;
String _getRouteLabel(MaterialLocalizations localizations) {
- switch (Theme.of(context)!.platform) {
+ switch (Theme.of(context).platform) {
case TargetPlatform.iOS:
case TargetPlatform.macOS:
return '';
@@ -350,6 +352,7 @@
case TargetPlatform.windows:
return localizations.dialogLabel;
}
+ return null;
}
void handleDragStart(DragStartDetails details) {
@@ -357,10 +360,10 @@
animationCurve = Curves.linear;
}
- void handleDragEnd(DragEndDetails details, {bool? isClosing}) {
+ void handleDragEnd(DragEndDetails details, {bool isClosing}) {
// Allow the bottom sheet to animate smoothly from its current position.
animationCurve = _BottomSheetSuspendedCurve(
- widget.route!.animation!.value,
+ widget.route.animation.value,
curve: _modalBottomSheetCurve,
);
}
@@ -369,20 +372,20 @@
Widget build(BuildContext context) {
assert(debugCheckHasMediaQuery(context));
assert(debugCheckHasMaterialLocalizations(context));
- final MediaQueryData? mediaQuery = MediaQuery.of(context);
- final MaterialLocalizations localizations = MaterialLocalizations.of(context)!;
+ final MediaQueryData mediaQuery = MediaQuery.of(context);
+ final MaterialLocalizations localizations = MaterialLocalizations.of(context);
final String routeLabel = _getRouteLabel(localizations);
return AnimatedBuilder(
- animation: widget.route!.animation!,
+ animation: widget.route.animation,
child: BottomSheet(
- animationController: widget.route!._animationController,
+ animationController: widget.route._animationController,
onClosing: () {
- if (widget.route!.isCurrent) {
+ if (widget.route.isCurrent) {
Navigator.pop(context);
}
},
- builder: widget.route!.builder!,
+ builder: widget.route.builder,
backgroundColor: widget.backgroundColor,
elevation: widget.elevation,
shape: widget.shape,
@@ -391,11 +394,11 @@
onDragStart: handleDragStart,
onDragEnd: handleDragEnd,
),
- builder: (BuildContext context, Widget? child) {
+ builder: (BuildContext context, Widget child) {
// Disable the initial animation when accessible navigation is on so
// that the semantics are added to the tree at the correct time.
final double animationValue = animationCurve.transform(
- mediaQuery!.accessibleNavigation ? 1.0 : widget.route!.animation!.value
+ mediaQuery.accessibleNavigation ? 1.0 : widget.route.animation.value
);
return Semantics(
scopesRoute: true,
@@ -426,21 +429,21 @@
this.modalBarrierColor,
this.isDismissible = true,
this.enableDrag = true,
- required this.isScrollControlled,
- RouteSettings? settings,
+ @required this.isScrollControlled,
+ RouteSettings settings,
}) : assert(isScrollControlled != null),
assert(isDismissible != null),
assert(enableDrag != null),
super(settings: settings);
- final WidgetBuilder? builder;
- final ThemeData? theme;
+ final WidgetBuilder builder;
+ final ThemeData theme;
final bool isScrollControlled;
- final Color? backgroundColor;
- final double? elevation;
- final ShapeBorder? shape;
- final Clip? clipBehavior;
- final Color? modalBarrierColor;
+ final Color backgroundColor;
+ final double elevation;
+ final ShapeBorder shape;
+ final Clip clipBehavior;
+ final Color modalBarrierColor;
final bool isDismissible;
final bool enableDrag;
@@ -454,23 +457,23 @@
bool get barrierDismissible => isDismissible;
@override
- final String? barrierLabel;
+ final String barrierLabel;
@override
Color get barrierColor => modalBarrierColor ?? Colors.black54;
- AnimationController? _animationController;
+ AnimationController _animationController;
@override
AnimationController createAnimationController() {
assert(_animationController == null);
- _animationController = BottomSheet.createAnimationController(navigator!.overlay!);
- return _animationController!;
+ _animationController = BottomSheet.createAnimationController(navigator.overlay);
+ return _animationController;
}
@override
Widget buildPage(BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation) {
- final BottomSheetThemeData sheetTheme = theme?.bottomSheetTheme ?? Theme.of(context)!.bottomSheetTheme;
+ final BottomSheetThemeData sheetTheme = theme?.bottomSheetTheme ?? Theme.of(context).bottomSheetTheme;
// By definition, the bottom sheet is aligned to the bottom of the page
// and isn't exposed to the top padding of the MediaQuery.
Widget bottomSheet = MediaQuery.removePadding(
@@ -478,8 +481,8 @@
removeTop: true,
child: _ModalBottomSheet<T>(
route: this,
- backgroundColor: backgroundColor ?? sheetTheme.modalBackgroundColor ?? sheetTheme.backgroundColor,
- elevation: elevation ?? sheetTheme.modalElevation ?? sheetTheme.elevation,
+ backgroundColor: backgroundColor ?? sheetTheme?.modalBackgroundColor ?? sheetTheme?.backgroundColor,
+ elevation: elevation ?? sheetTheme?.modalElevation ?? sheetTheme?.elevation,
shape: shape,
clipBehavior: clipBehavior,
isScrollControlled: isScrollControlled,
@@ -487,7 +490,7 @@
),
);
if (theme != null)
- bottomSheet = Theme(data: theme!, child: bottomSheet);
+ bottomSheet = Theme(data: theme, child: bottomSheet);
return bottomSheet;
}
}
@@ -541,7 +544,7 @@
final double curveProgress = (t - startingPoint) / (1 - startingPoint);
final double transformed = curve.transform(curveProgress);
- return lerpDouble(startingPoint, 1, transformed)!;
+ return lerpDouble(startingPoint, 1, transformed);
}
@override
@@ -645,18 +648,18 @@
/// that grows and then becomes scrollable once it reaches its maximum size.
/// * <https://material.io/design/components/sheets-bottom.html#modal-bottom-sheet>
Future<T> showModalBottomSheet<T>({
- required BuildContext context,
- required WidgetBuilder builder,
- Color? backgroundColor,
- double? elevation,
- ShapeBorder? shape,
- Clip? clipBehavior,
- Color? barrierColor,
+ @required BuildContext context,
+ @required WidgetBuilder builder,
+ Color backgroundColor,
+ double elevation,
+ ShapeBorder shape,
+ Clip clipBehavior,
+ Color barrierColor,
bool isScrollControlled = false,
bool useRootNavigator = false,
bool isDismissible = true,
bool enableDrag = true,
- RouteSettings? routeSettings,
+ RouteSettings routeSettings,
}) {
assert(context != null);
assert(builder != null);
@@ -667,11 +670,11 @@
assert(debugCheckHasMediaQuery(context));
assert(debugCheckHasMaterialLocalizations(context));
- return Navigator.of(context, rootNavigator: useRootNavigator)!.push(_ModalBottomSheetRoute<T>(
+ return Navigator.of(context, rootNavigator: useRootNavigator).push(_ModalBottomSheetRoute<T>(
builder: builder,
theme: Theme.of(context, shadowThemeOnly: true),
isScrollControlled: isScrollControlled,
- barrierLabel: MaterialLocalizations.of(context)!.modalBarrierDismissLabel,
+ barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel,
backgroundColor: backgroundColor,
elevation: elevation,
shape: shape,
@@ -723,18 +726,18 @@
/// * [Scaffold.of], for information about how to obtain the [BuildContext].
/// * <https://material.io/design/components/sheets-bottom.html#standard-bottom-sheet>
PersistentBottomSheetController<T> showBottomSheet<T>({
- required BuildContext context,
- required WidgetBuilder builder,
- Color? backgroundColor,
- double? elevation,
- ShapeBorder? shape,
- Clip? clipBehavior,
+ @required BuildContext context,
+ @required WidgetBuilder builder,
+ Color backgroundColor,
+ double elevation,
+ ShapeBorder shape,
+ Clip clipBehavior,
}) {
assert(context != null);
assert(builder != null);
assert(debugCheckHasScaffold(context));
- return Scaffold.of(context)!.showBottomSheet<T>(
+ return Scaffold.of(context).showBottomSheet<T>(
builder,
backgroundColor: backgroundColor,
elevation: elevation,
diff --git a/packages/flutter/lib/src/material/button.dart b/packages/flutter/lib/src/material/button.dart
index dec79b2..ca137cd 100644
--- a/packages/flutter/lib/src/material/button.dart
+++ b/packages/flutter/lib/src/material/button.dart
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// @dart = 2.8
+
import 'dart:math' as math;
import 'package:flutter/foundation.dart';
@@ -49,8 +51,8 @@
/// [elevation], [focusElevation], [hoverElevation], [highlightElevation], and
/// [disabledElevation] must be non-negative.
const RawMaterialButton({
- Key? key,
- required this.onPressed,
+ Key key,
+ @required this.onPressed,
this.onLongPress,
this.onHighlightChanged,
this.mouseCursor,
@@ -73,7 +75,7 @@
this.clipBehavior = Clip.none,
this.focusNode,
this.autofocus = false,
- MaterialTapTargetSize? materialTapTargetSize,
+ MaterialTapTargetSize materialTapTargetSize,
this.child,
this.enableFeedback = true,
}) : materialTapTargetSize = materialTapTargetSize ?? MaterialTapTargetSize.padded,
@@ -97,7 +99,7 @@
/// See also:
///
/// * [enabled], which is true if the button is enabled.
- final VoidCallback? onPressed;
+ final VoidCallback onPressed;
/// Called when the button is long-pressed.
///
@@ -106,7 +108,7 @@
/// See also:
///
/// * [enabled], which is true if the button is enabled.
- final VoidCallback? onLongPress;
+ final VoidCallback onLongPress;
/// Called by the underlying [InkWell] widget's [InkWell.onHighlightChanged]
/// callback.
@@ -114,7 +116,7 @@
/// If [onPressed] changes from null to non-null while a gesture is ongoing,
/// this can fire during the build phase (in which case calling
/// [State.setState] is not allowed).
- final ValueChanged<bool>? onHighlightChanged;
+ final ValueChanged<bool> onHighlightChanged;
/// {@template flutter.material.button.mouseCursor}
/// The cursor for a mouse pointer when it enters or is hovering over the
@@ -130,7 +132,7 @@
///
/// If this property is null, [MaterialStateMouseCursor.clickable] will be used.
/// {@endtemplate}
- final MouseCursor? mouseCursor;
+ final MouseCursor mouseCursor;
/// Defines the default text style, with [Material.textStyle], for the
/// button's [child].
@@ -142,22 +144,22 @@
/// * [MaterialState.hovered].
/// * [MaterialState.focused].
/// * [MaterialState.disabled].
- final TextStyle? textStyle;
+ final TextStyle textStyle;
/// The color of the button's [Material].
- final Color? fillColor;
+ final Color fillColor;
/// The color for the button's [Material] when it has the input focus.
- final Color? focusColor;
+ final Color focusColor;
/// The color for the button's [Material] when a pointer is hovering over it.
- final Color? hoverColor;
+ final Color hoverColor;
/// The highlight color for the button's [InkWell].
- final Color? highlightColor;
+ final Color highlightColor;
/// The splash color for the button's [InkWell].
- final Color? splashColor;
+ final Color splashColor;
/// The elevation for the button's [Material] when the button
/// is [enabled] but not pressed.
@@ -273,7 +275,7 @@
final Duration animationDuration;
/// Typically the button's label.
- final Widget? child;
+ final Widget child;
/// Whether the button is enabled or disabled.
///
@@ -291,7 +293,7 @@
final MaterialTapTargetSize materialTapTargetSize;
/// {@macro flutter.widgets.Focus.focusNode}
- final FocusNode? focusNode;
+ final FocusNode focusNode;
/// {@macro flutter.widgets.Focus.autofocus}
final bool autofocus;
@@ -332,7 +334,7 @@
setState(() {
_updateState(MaterialState.pressed, value);
if (widget.onHighlightChanged != null) {
- widget.onHighlightChanged!(value);
+ widget.onHighlightChanged(value);
}
});
}
@@ -393,11 +395,11 @@
@override
Widget build(BuildContext context) {
- final Color? effectiveTextColor = MaterialStateProperty.resolveAs<Color>(widget.textStyle?.color, _states);
- final ShapeBorder? effectiveShape = MaterialStateProperty.resolveAs<ShapeBorder>(widget.shape, _states);
+ final Color effectiveTextColor = MaterialStateProperty.resolveAs<Color>(widget.textStyle?.color, _states);
+ final ShapeBorder effectiveShape = MaterialStateProperty.resolveAs<ShapeBorder>(widget.shape, _states);
final Offset densityAdjustment = widget.visualDensity.baseSizeAdjustment;
final BoxConstraints effectiveConstraints = widget.visualDensity.effectiveConstraints(widget.constraints);
- final MouseCursor? effectiveMouseCursor = MaterialStateProperty.resolveAs<MouseCursor>(
+ final MouseCursor effectiveMouseCursor = MaterialStateProperty.resolveAs<MouseCursor>(
widget.mouseCursor ?? MaterialStateMouseCursor.clickable,
_states,
);
@@ -485,9 +487,9 @@
/// "tap target", but not its material or its ink splashes.
class _InputPadding extends SingleChildRenderObjectWidget {
const _InputPadding({
- Key? key,
- Widget? child,
- required this.minSize,
+ Key key,
+ Widget child,
+ this.minSize,
}) : super(key: key, child: child);
final Size minSize;
@@ -504,7 +506,7 @@
}
class _RenderInputPadding extends RenderShiftedBox {
- _RenderInputPadding(this._minSize, [RenderBox? child]) : super(child);
+ _RenderInputPadding(this._minSize, [RenderBox child]) : super(child);
Size get minSize => _minSize;
Size _minSize;
@@ -518,57 +520,58 @@
@override
double computeMinIntrinsicWidth(double height) {
if (child != null)
- return math.max(child!.getMinIntrinsicWidth(height), minSize.width);
+ return math.max(child.getMinIntrinsicWidth(height), minSize.width);
return 0.0;
}
@override
double computeMinIntrinsicHeight(double width) {
if (child != null)
- return math.max(child!.getMinIntrinsicHeight(width), minSize.height);
+ return math.max(child.getMinIntrinsicHeight(width), minSize.height);
return 0.0;
}
@override
double computeMaxIntrinsicWidth(double height) {
if (child != null)
- return math.max(child!.getMaxIntrinsicWidth(height), minSize.width);
+ return math.max(child.getMaxIntrinsicWidth(height), minSize.width);
return 0.0;
}
@override
double computeMaxIntrinsicHeight(double width) {
if (child != null)
- return math.max(child!.getMaxIntrinsicHeight(width), minSize.height);
+ return math.max(child.getMaxIntrinsicHeight(width), minSize.height);
return 0.0;
}
@override
void performLayout() {
+ final BoxConstraints constraints = this.constraints;
if (child != null) {
- child!.layout(constraints, parentUsesSize: true);
- final double height = math.max(child!.size.width, minSize.width);
- final double width = math.max(child!.size.height, minSize.height);
+ child.layout(constraints, parentUsesSize: true);
+ final double height = math.max(child.size.width, minSize.width);
+ final double width = math.max(child.size.height, minSize.height);
size = constraints.constrain(Size(height, width));
- final BoxParentData childParentData = child!.parentData as BoxParentData;
- childParentData.offset = Alignment.center.alongOffset(size - child!.size as Offset);
+ final BoxParentData childParentData = child.parentData as BoxParentData;
+ childParentData.offset = Alignment.center.alongOffset(size - child.size as Offset);
} else {
size = Size.zero;
}
}
@override
- bool hitTest(BoxHitTestResult result, { required Offset position }) {
+ bool hitTest(BoxHitTestResult result, { Offset position }) {
if (super.hitTest(result, position: position)) {
return true;
}
- final Offset center = child!.size.center(Offset.zero);
+ final Offset center = child.size.center(Offset.zero);
return result.addWithRawTransform(
transform: MatrixUtils.forceToPoint(center),
position: center,
- hitTest: (BoxHitTestResult result, Offset? position) {
+ hitTest: (BoxHitTestResult result, Offset position) {
assert(position == center);
- return child!.hitTest(result, position: center);
+ return child.hitTest(result, position: center);
},
);
}
diff --git a/packages/flutter/lib/src/material/button_bar.dart b/packages/flutter/lib/src/material/button_bar.dart
index 002ae92..5811a96 100644
--- a/packages/flutter/lib/src/material/button_bar.dart
+++ b/packages/flutter/lib/src/material/button_bar.dart
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// @dart = 2.8
+
import 'package:flutter/widgets.dart';
import 'package:flutter/rendering.dart';
@@ -54,7 +56,7 @@
/// Both [buttonMinWidth] and [buttonHeight] must be non-negative if they
/// are not null.
const ButtonBar({
- Key? key,
+ Key key,
this.alignment,
this.mainAxisSize,
this.buttonTextTheme,
@@ -75,13 +77,13 @@
///
/// If null then it will use [ButtonBarThemeData.alignment]. If that is null,
/// it will default to [MainAxisAlignment.end].
- final MainAxisAlignment? alignment;
+ final MainAxisAlignment alignment;
/// How much horizontal space is available. See [Row.mainAxisSize].
///
/// If null then it will use the surrounding [ButtonBarThemeData.mainAxisSize].
/// If that is null, it will default to [MainAxisSize.max].
- final MainAxisSize? mainAxisSize;
+ final MainAxisSize mainAxisSize;
/// Overrides the surrounding [ButtonBarThemeData.buttonTextTheme] to define a
/// button's base colors, size, internal padding and shape.
@@ -89,21 +91,21 @@
/// If null then it will use the surrounding
/// [ButtonBarThemeData.buttonTextTheme]. If that is null, it will default to
/// [ButtonTextTheme.primary].
- final ButtonTextTheme? buttonTextTheme;
+ final ButtonTextTheme buttonTextTheme;
/// Overrides the surrounding [ButtonThemeData.minWidth] to define a button's
/// minimum width.
///
/// If null then it will use the surrounding [ButtonBarThemeData.buttonMinWidth].
/// If that is null, it will default to 64.0 logical pixels.
- final double? buttonMinWidth;
+ final double buttonMinWidth;
/// Overrides the surrounding [ButtonThemeData.height] to define a button's
/// minimum height.
///
/// If null then it will use the surrounding [ButtonBarThemeData.buttonHeight].
/// If that is null, it will default to 36.0 logical pixels.
- final double? buttonHeight;
+ final double buttonHeight;
/// Overrides the surrounding [ButtonThemeData.padding] to define the padding
/// for a button's child (typically the button's label).
@@ -111,14 +113,14 @@
/// If null then it will use the surrounding [ButtonBarThemeData.buttonPadding].
/// If that is null, it will default to 8.0 logical pixels on the left
/// and right.
- final EdgeInsetsGeometry? buttonPadding;
+ final EdgeInsetsGeometry buttonPadding;
/// Overrides the surrounding [ButtonThemeData.alignedDropdown] to define whether
/// a [DropdownButton] menu's width will match the button's width.
///
/// If null then it will use the surrounding [ButtonBarThemeData.buttonAlignedDropdown].
/// If that is null, it will default to false.
- final bool? buttonAlignedDropdown;
+ final bool buttonAlignedDropdown;
/// Defines whether a [ButtonBar] should size itself with a minimum size
/// constraint or with padding.
@@ -127,7 +129,7 @@
///
/// If null then it will use the surrounding [ButtonBarThemeData.layoutBehavior].
/// If that is null, it will default [ButtonBarLayoutBehavior.padded].
- final ButtonBarLayoutBehavior? layoutBehavior;
+ final ButtonBarLayoutBehavior layoutBehavior;
/// Defines the vertical direction of a [ButtonBar]'s children if it
/// overflows.
@@ -143,7 +145,7 @@
/// If null then it will use the surrounding
/// [ButtonBarThemeData.overflowDirection]. If that is null, it will
/// default to [VerticalDirection.down].
- final VerticalDirection? overflowDirection;
+ final VerticalDirection overflowDirection;
/// The spacing between buttons when the button bar overflows.
///
@@ -159,7 +161,7 @@
///
/// If null then no spacing will be added in between buttons in
/// an overflow state.
- final double? overflowButtonSpacing;
+ final double overflowButtonSpacing;
/// The buttons to arrange horizontally.
///
@@ -214,6 +216,8 @@
child: child,
);
}
+ assert(false);
+ return null;
}
}
@@ -235,14 +239,14 @@
/// Creates a button bar that attempts to display in a row, but displays in
/// a column if there is insufficient horizontal space.
_ButtonBarRow({
- required List<Widget> children,
+ List<Widget> children,
Axis direction = Axis.horizontal,
MainAxisSize mainAxisSize = MainAxisSize.max,
MainAxisAlignment mainAxisAlignment = MainAxisAlignment.start,
CrossAxisAlignment crossAxisAlignment = CrossAxisAlignment.center,
- TextDirection? textDirection,
+ TextDirection textDirection,
VerticalDirection overflowDirection = VerticalDirection.down,
- TextBaseline? textBaseline,
+ TextBaseline textBaseline,
this.overflowButtonSpacing,
}) : super(
children: children,
@@ -255,7 +259,7 @@
textBaseline: textBaseline,
);
- final double? overflowButtonSpacing;
+ final double overflowButtonSpacing;
@override
_RenderButtonBarRow createRenderObject(BuildContext context) {
@@ -264,7 +268,7 @@
mainAxisAlignment: mainAxisAlignment,
mainAxisSize: mainAxisSize,
crossAxisAlignment: crossAxisAlignment,
- textDirection: getEffectiveTextDirection(context)!,
+ textDirection: getEffectiveTextDirection(context),
verticalDirection: verticalDirection,
textBaseline: textBaseline,
overflowButtonSpacing: overflowButtonSpacing,
@@ -303,14 +307,14 @@
/// Creates a button bar that attempts to display in a row, but displays in
/// a column if there is insufficient horizontal space.
_RenderButtonBarRow({
- List<RenderBox>? children,
+ List<RenderBox> children,
Axis direction = Axis.horizontal,
MainAxisSize mainAxisSize = MainAxisSize.max,
MainAxisAlignment mainAxisAlignment = MainAxisAlignment.start,
CrossAxisAlignment crossAxisAlignment = CrossAxisAlignment.center,
- required TextDirection textDirection,
+ @required TextDirection textDirection,
VerticalDirection verticalDirection = VerticalDirection.down,
- TextBaseline? textBaseline,
+ TextBaseline textBaseline,
this.overflowButtonSpacing,
}) : assert(textDirection != null),
assert(overflowButtonSpacing == null || overflowButtonSpacing >= 0),
@@ -326,13 +330,13 @@
);
bool _hasCheckedLayoutWidth = false;
- double? overflowButtonSpacing;
+ double overflowButtonSpacing;
@override
BoxConstraints get constraints {
if (_hasCheckedLayoutWidth)
return super.constraints;
- return super.constraints.copyWith(maxWidth: double.infinity);
+ return super.constraints?.copyWith(maxWidth: double.infinity);
}
@override
@@ -355,7 +359,7 @@
super.performLayout();
} else {
final BoxConstraints childConstraints = constraints.copyWith(minWidth: 0.0);
- RenderBox? child;
+ RenderBox child;
double currentHeight = 0.0;
switch (verticalDirection) {
case VerticalDirection.down:
@@ -377,7 +381,7 @@
// alignment for a row. For [MainAxisAlignment.spaceAround],
// [MainAxisAlignment.spaceBetween] and [MainAxisAlignment.spaceEvenly]
// cases, use [MainAxisAlignment.start].
- switch (textDirection!) {
+ switch (textDirection) {
case TextDirection.ltr:
switch (mainAxisAlignment) {
case MainAxisAlignment.center:
@@ -418,7 +422,7 @@
}
if (overflowButtonSpacing != null && child != null)
- currentHeight += overflowButtonSpacing!;
+ currentHeight += overflowButtonSpacing;
}
size = constraints.constrain(Size(constraints.maxWidth, currentHeight));
}
diff --git a/packages/flutter/lib/src/material/button_bar_theme.dart b/packages/flutter/lib/src/material/button_bar_theme.dart
index cea6db8..29ff1fc 100644
--- a/packages/flutter/lib/src/material/button_bar_theme.dart
+++ b/packages/flutter/lib/src/material/button_bar_theme.dart
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// @dart = 2.8
+
import 'dart:ui' show lerpDouble;
import 'package:flutter/foundation.dart';
@@ -44,10 +46,10 @@
assert(buttonHeight == null || buttonHeight >= 0.0);
/// How the children should be placed along the horizontal axis.
- final MainAxisAlignment? alignment;
+ final MainAxisAlignment alignment;
/// How much horizontal space is available. See [Row.mainAxisSize].
- final MainAxisSize? mainAxisSize;
+ final MainAxisSize mainAxisSize;
/// Defines a [ButtonBar] button's base colors, and the defaults for
/// the button's minimum size, internal padding, and shape.
@@ -57,7 +59,7 @@
///
/// Despite the name, this property is not a [TextTheme], its value is not a
/// collection of [TextStyle]s.
- final ButtonTextTheme? buttonTextTheme;
+ final ButtonTextTheme buttonTextTheme;
/// The minimum width for [ButtonBar] buttons.
///
@@ -66,19 +68,19 @@
///
/// The actual horizontal space allocated for a button's child is
/// at least this value less the theme's horizontal [ButtonThemeData.padding].
- final double? buttonMinWidth;
+ final double buttonMinWidth;
/// The minimum height for [ButtonBar] buttons.
///
/// This will override the surrounding [ButtonThemeData.height] setting
/// for buttons contained in the [ButtonBar].
- final double? buttonHeight;
+ final double buttonHeight;
/// Padding for a [ButtonBar] button's child (typically the button's label).
///
/// This will override the surrounding [ButtonThemeData.padding] setting
/// for buttons contained in the [ButtonBar].
- final EdgeInsetsGeometry? buttonPadding;
+ final EdgeInsetsGeometry buttonPadding;
/// If true, then a [DropdownButton] menu's width will match the [ButtonBar]
/// button's width.
@@ -93,11 +95,11 @@
///
/// This property only affects [DropdownButton] contained in a [ButtonBar]
/// and its menu.
- final bool? buttonAlignedDropdown;
+ final bool buttonAlignedDropdown;
/// Defines whether a [ButtonBar] should size itself with a minimum size
/// constraint or with padding.
- final ButtonBarLayoutBehavior? layoutBehavior;
+ final ButtonBarLayoutBehavior layoutBehavior;
/// Defines the vertical direction of a [ButtonBar]'s children if it
/// overflows.
@@ -109,20 +111,20 @@
/// the first action will be at the bottom of the column if this
/// property is set to [VerticalDirection.up], since it "starts" at the
/// bottom and "ends" at the top.
- final VerticalDirection? overflowDirection;
+ final VerticalDirection overflowDirection;
/// Creates a copy of this object but with the given fields replaced with the
/// new values.
ButtonBarThemeData copyWith({
- MainAxisAlignment? alignment,
- MainAxisSize? mainAxisSize,
- ButtonTextTheme? buttonTextTheme,
- double? buttonMinWidth,
- double? buttonHeight,
- EdgeInsetsGeometry? buttonPadding,
- bool? buttonAlignedDropdown,
- ButtonBarLayoutBehavior? layoutBehavior,
- VerticalDirection? overflowDirection,
+ MainAxisAlignment alignment,
+ MainAxisSize mainAxisSize,
+ ButtonTextTheme buttonTextTheme,
+ double buttonMinWidth,
+ double buttonHeight,
+ EdgeInsetsGeometry buttonPadding,
+ bool buttonAlignedDropdown,
+ ButtonBarLayoutBehavior layoutBehavior,
+ VerticalDirection overflowDirection,
}) {
return ButtonBarThemeData(
alignment: alignment ?? this.alignment,
@@ -142,20 +144,20 @@
/// If both arguments are null, then null is returned.
///
/// {@macro dart.ui.shadow.lerp}
- static ButtonBarThemeData? lerp(ButtonBarThemeData? a, ButtonBarThemeData? b, double t) {
+ static ButtonBarThemeData lerp(ButtonBarThemeData a, ButtonBarThemeData b, double t) {
assert(t != null);
if (a == null && b == null)
return null;
return ButtonBarThemeData(
- alignment: t < 0.5 ? a?.alignment : b?.alignment,
- mainAxisSize: t < 0.5 ? a?.mainAxisSize : b?.mainAxisSize,
- buttonTextTheme: t < 0.5 ? a?.buttonTextTheme : b?.buttonTextTheme,
+ alignment: t < 0.5 ? a.alignment : b.alignment,
+ mainAxisSize: t < 0.5 ? a.mainAxisSize : b.mainAxisSize,
+ buttonTextTheme: t < 0.5 ? a.buttonTextTheme : b.buttonTextTheme,
buttonMinWidth: lerpDouble(a?.buttonMinWidth, b?.buttonMinWidth, t),
buttonHeight: lerpDouble(a?.buttonHeight, b?.buttonHeight, t),
buttonPadding: EdgeInsetsGeometry.lerp(a?.buttonPadding, b?.buttonPadding, t),
- buttonAlignedDropdown: t < 0.5 ? a?.buttonAlignedDropdown : b?.buttonAlignedDropdown,
- layoutBehavior: t < 0.5 ? a?.layoutBehavior : b?.layoutBehavior,
- overflowDirection: t < 0.5 ? a?.overflowDirection : b?.overflowDirection,
+ buttonAlignedDropdown: t < 0.5 ? a.buttonAlignedDropdown : b.buttonAlignedDropdown,
+ layoutBehavior: t < 0.5 ? a.layoutBehavior : b.layoutBehavior,
+ overflowDirection: t < 0.5 ? a.overflowDirection : b.overflowDirection,
);
}
@@ -233,9 +235,9 @@
///
/// The [data] must not be null.
const ButtonBarTheme({
- Key? key,
- required this.data,
- required Widget child,
+ Key key,
+ @required this.data,
+ Widget child,
}) : assert(data != null), super(key: key, child: child);
/// The properties used for all descendant [ButtonBar] widgets.
@@ -251,8 +253,8 @@
/// ButtonBarThemeData theme = ButtonBarTheme.of(context);
/// ```
static ButtonBarThemeData of(BuildContext context) {
- final ButtonBarTheme? buttonBarTheme = context.dependOnInheritedWidgetOfExactType<ButtonBarTheme>();
- return buttonBarTheme?.data ?? Theme.of(context)!.buttonBarTheme;
+ final ButtonBarTheme buttonBarTheme = context.dependOnInheritedWidgetOfExactType<ButtonBarTheme>();
+ return buttonBarTheme?.data ?? Theme.of(context).buttonBarTheme;
}
@override
diff --git a/packages/flutter/lib/src/material/button_style.dart b/packages/flutter/lib/src/material/button_style.dart
index 8f1f43b..d8bb11da 100644
--- a/packages/flutter/lib/src/material/button_style.dart
+++ b/packages/flutter/lib/src/material/button_style.dart
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// @dart = 2.8
+
import 'dart:ui' show lerpDouble;
import 'package:flutter/foundation.dart';
@@ -120,10 +122,10 @@
///
/// The color of the [textStyle] is typically not used directly, the
/// [foregroundColor] is used instead.
- final MaterialStateProperty<TextStyle>? textStyle;
+ final MaterialStateProperty<TextStyle> textStyle;
/// The button's background fill color.
- final MaterialStateProperty<Color>? backgroundColor;
+ final MaterialStateProperty<Color> backgroundColor;
/// The color for the button's [Text] and [Icon] widget descendants.
///
@@ -131,11 +133,11 @@
/// of the components that compute defaults from [ButtonStyle] values
/// compute a default [foregroundColor] and use that instead of the
/// [textStyle]'s color.
- final MaterialStateProperty<Color>? foregroundColor;
+ final MaterialStateProperty<Color> foregroundColor;
/// The highlight color that's typically used to indicate that
/// the button is focused, hovered, or pressed.
- final MaterialStateProperty<Color>? overlayColor;
+ final MaterialStateProperty<Color> overlayColor;
/// The shadow color of the button's [Material].
///
@@ -143,35 +145,35 @@
/// dark themes, so by default the button classes add a
/// semi-transparent overlay to indicate elevation. See
/// [ThemeData.applyElevationOverlayColor].
- final MaterialStateProperty<Color>? shadowColor;
+ final MaterialStateProperty<Color> shadowColor;
/// The elevation of the button's [Material].
- final MaterialStateProperty<double>? elevation;
+ final MaterialStateProperty<double> elevation;
/// The padding between the button's boundary and its child.
- final MaterialStateProperty<EdgeInsetsGeometry>? padding;
+ final MaterialStateProperty<EdgeInsetsGeometry> padding;
/// The minimum size of the button itself.
///
/// The size of the rectangle the button lies within may be larger
/// per [tapTargetSize].
- final MaterialStateProperty<Size>? minimumSize;
+ final MaterialStateProperty<Size> minimumSize;
/// The color and weight of the button's outline.
///
/// This value is combined with [shape] to create a shape decorated
/// with an outline.
- final MaterialStateProperty<BorderSide>? side;
+ final MaterialStateProperty<BorderSide> side;
/// The shape of the button's underlying [Material].
///
/// This shape is combined with [side] to create a shape decorated
/// with an outline.
- final MaterialStateProperty<OutlinedBorder>? shape;
+ final MaterialStateProperty<OutlinedBorder> shape;
/// The cursor for a mouse pointer when it enters or is hovering over
/// this button's [InkWell].
- final MaterialStateProperty<MouseCursor>? mouseCursor;
+ final MaterialStateProperty<MouseCursor> mouseCursor;
/// Defines how compact the button's layout will be.
///
@@ -181,7 +183,7 @@
///
/// * [ThemeData.visualDensity], which specifies the [visualDensity] for all widgets
/// within a [Theme].
- final VisualDensity? visualDensity;
+ final VisualDensity visualDensity;
/// Configures the minimum size of the area within which the button may be pressed.
///
@@ -189,12 +191,12 @@
/// a transparent margin that responds to taps.
///
/// Always defaults to [ThemeData.materialTapTargetSize].
- final MaterialTapTargetSize? tapTargetSize;
+ final MaterialTapTargetSize tapTargetSize;
/// Defines the duration of animated changes for [shape] and [elevation].
///
/// Typically the component default value is [kThemeChangeDuration].
- final Duration? animationDuration;
+ final Duration animationDuration;
/// Whether detected gestures should provide acoustic and/or haptic feedback.
///
@@ -206,26 +208,26 @@
/// See also:
///
/// * [Feedback] for providing platform-specific feedback to certain actions.
- final bool? enableFeedback;
+ final bool enableFeedback;
/// Returns a copy of this ButtonStyle with the given fields replaced with
/// the new values.
ButtonStyle copyWith({
- MaterialStateProperty<TextStyle>? textStyle,
- MaterialStateProperty<Color>? backgroundColor,
- MaterialStateProperty<Color>? foregroundColor,
- MaterialStateProperty<Color>? overlayColor,
- MaterialStateProperty<Color>? shadowColor,
- MaterialStateProperty<double>? elevation,
- MaterialStateProperty<EdgeInsetsGeometry>? padding,
- MaterialStateProperty<Size>? minimumSize,
- MaterialStateProperty<BorderSide>? side,
- MaterialStateProperty<OutlinedBorder>? shape,
- MaterialStateProperty<MouseCursor>? mouseCursor,
- VisualDensity? visualDensity,
- MaterialTapTargetSize? tapTargetSize,
- Duration? animationDuration,
- bool? enableFeedback,
+ MaterialStateProperty<TextStyle> textStyle,
+ MaterialStateProperty<Color> backgroundColor,
+ MaterialStateProperty<Color> foregroundColor,
+ MaterialStateProperty<Color> overlayColor,
+ MaterialStateProperty<Color> shadowColor,
+ MaterialStateProperty<double> elevation,
+ MaterialStateProperty<EdgeInsetsGeometry> padding,
+ MaterialStateProperty<Size> minimumSize,
+ MaterialStateProperty<BorderSide> side,
+ MaterialStateProperty<OutlinedBorder> shape,
+ MaterialStateProperty<MouseCursor> mouseCursor,
+ VisualDensity visualDensity,
+ MaterialTapTargetSize tapTargetSize,
+ Duration animationDuration,
+ bool enableFeedback,
}) {
return ButtonStyle(
textStyle: textStyle ?? this.textStyle,
@@ -251,7 +253,7 @@
///
/// In other words, [style] is used to fill in unspecified (null) fields
/// this ButtonStyle.
- ButtonStyle merge(ButtonStyle? style) {
+ ButtonStyle merge(ButtonStyle style) {
if (style == null)
return this;
return copyWith(
@@ -339,7 +341,7 @@
}
/// Linearly interpolate between two [ButtonStyle]s.
- static ButtonStyle? lerp(ButtonStyle? a, ButtonStyle? b, double t) {
+ static ButtonStyle lerp(ButtonStyle a, ButtonStyle b, double t) {
assert (t != null);
if (a == null && b == null)
return null;
@@ -354,15 +356,15 @@
minimumSize: _lerpProperties<Size>(a?.minimumSize, b?.minimumSize, t, Size.lerp),
side: _lerpSides(a?.side, b?.side, t),
shape: _lerpShapes(a?.shape, b?.shape, t),
- mouseCursor: t < 0.5 ? a?.mouseCursor : b?.mouseCursor,
- visualDensity: t < 0.5 ? a?.visualDensity : b?.visualDensity,
- tapTargetSize: t < 0.5 ? a?.tapTargetSize : b?.tapTargetSize,
- animationDuration: t < 0.5 ? a?.animationDuration : b?.animationDuration,
- enableFeedback: t < 0.5 ? a?.enableFeedback : b?.enableFeedback,
+ mouseCursor: t < 0.5 ? a.mouseCursor : b.mouseCursor,
+ visualDensity: t < 0.5 ? a.visualDensity : b.visualDensity,
+ tapTargetSize: t < 0.5 ? a.tapTargetSize : b.tapTargetSize,
+ animationDuration: t < 0.5 ? a.animationDuration : b.animationDuration,
+ enableFeedback: t < 0.5 ? a.enableFeedback : b.enableFeedback,
);
}
- static MaterialStateProperty<T>? _lerpProperties<T>(MaterialStateProperty<T>? a, MaterialStateProperty<T>? b, double t, T? Function(T?, T?, double) lerpFunction ) {
+ static MaterialStateProperty<T> _lerpProperties<T>(MaterialStateProperty<T> a, MaterialStateProperty<T> b, double t, T Function(T, T, double) lerpFunction ) {
// Avoid creating a _LerpProperties object for a common case.
if (a == null && b == null)
return null;
@@ -370,14 +372,14 @@
}
// Special case because BorderSide.lerp() doesn't support null arguments
- static MaterialStateProperty<BorderSide>? _lerpSides(MaterialStateProperty<BorderSide>? a, MaterialStateProperty<BorderSide>? b, double t) {
+ static MaterialStateProperty<BorderSide> _lerpSides(MaterialStateProperty<BorderSide> a, MaterialStateProperty<BorderSide> b, double t) {
if (a == null && b == null)
return null;
return _LerpSides(a, b, t);
}
// TODO(hansmuller): OutlinedBorder needs a lerp method - https://github.com/flutter/flutter/issues/60555.
- static MaterialStateProperty<OutlinedBorder>? _lerpShapes(MaterialStateProperty<OutlinedBorder>? a, MaterialStateProperty<OutlinedBorder>? b, double t) {
+ static MaterialStateProperty<OutlinedBorder> _lerpShapes(MaterialStateProperty<OutlinedBorder> a, MaterialStateProperty<OutlinedBorder> b, double t) {
if (a == null && b == null)
return null;
return _LerpShapes(a, b, t);
@@ -387,15 +389,15 @@
class _LerpProperties<T> implements MaterialStateProperty<T> {
const _LerpProperties(this.a, this.b, this.t, this.lerpFunction);
- final MaterialStateProperty<T>? a;
- final MaterialStateProperty<T>? b;
+ final MaterialStateProperty<T> a;
+ final MaterialStateProperty<T> b;
final double t;
- final T? Function(T?, T?, double) lerpFunction;
+ final T Function(T, T, double) lerpFunction;
@override
- T? resolve(Set<MaterialState> states) {
- final T? resolvedA = a?.resolve(states);
- final T? resolvedB = b?.resolve(states);
+ T resolve(Set<MaterialState> states) {
+ final T resolvedA = a?.resolve(states);
+ final T resolvedB = b?.resolve(states);
return lerpFunction(resolvedA, resolvedB, t);
}
}
@@ -403,18 +405,18 @@
class _LerpSides implements MaterialStateProperty<BorderSide> {
const _LerpSides(this.a, this.b, this.t);
- final MaterialStateProperty<BorderSide>? a;
- final MaterialStateProperty<BorderSide>? b;
+ final MaterialStateProperty<BorderSide> a;
+ final MaterialStateProperty<BorderSide> b;
final double t;
@override
- BorderSide? resolve(Set<MaterialState> states) {
- final BorderSide? resolvedA = a?.resolve(states);
- final BorderSide? resolvedB = b?.resolve(states);
+ BorderSide resolve(Set<MaterialState> states) {
+ final BorderSide resolvedA = a?.resolve(states);
+ final BorderSide resolvedB = b?.resolve(states);
if (resolvedA == null && resolvedB == null)
return null;
if (resolvedA == null)
- return BorderSide.lerp(BorderSide(width: 0, color: resolvedB!.color.withAlpha(0)), resolvedB, t);
+ return BorderSide.lerp(BorderSide(width: 0, color: resolvedB.color.withAlpha(0)), resolvedB, t);
if (resolvedB == null)
return BorderSide.lerp(BorderSide(width: 0, color: resolvedA.color.withAlpha(0)), resolvedA, t);
return BorderSide.lerp(resolvedA, resolvedB, t);
@@ -424,14 +426,14 @@
class _LerpShapes implements MaterialStateProperty<OutlinedBorder> {
const _LerpShapes(this.a, this.b, this.t);
- final MaterialStateProperty<OutlinedBorder>? a;
- final MaterialStateProperty<OutlinedBorder>? b;
+ final MaterialStateProperty<OutlinedBorder> a;
+ final MaterialStateProperty<OutlinedBorder> b;
final double t;
@override
- OutlinedBorder? resolve(Set<MaterialState> states) {
- final OutlinedBorder? resolvedA = a?.resolve(states);
- final OutlinedBorder? resolvedB = b?.resolve(states);
- return ShapeBorder.lerp(resolvedA, resolvedB, t) as OutlinedBorder?;
+ OutlinedBorder resolve(Set<MaterialState> states) {
+ final OutlinedBorder resolvedA = a?.resolve(states);
+ final OutlinedBorder resolvedB = b?.resolve(states);
+ return ShapeBorder.lerp(resolvedA, resolvedB, t) as OutlinedBorder;
}
}
diff --git a/packages/flutter/lib/src/material/button_style_button.dart b/packages/flutter/lib/src/material/button_style_button.dart
index 9d49dfe..853cb02 100644
--- a/packages/flutter/lib/src/material/button_style_button.dart
+++ b/packages/flutter/lib/src/material/button_style_button.dart
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// @dart = 2.8
+
import 'dart:math' as math;
import 'package:flutter/foundation.dart';
@@ -30,14 +32,14 @@
abstract class ButtonStyleButton extends StatefulWidget {
/// Create a [ButtonStyleButton].
const ButtonStyleButton({
- Key? key,
- required this.onPressed,
- required this.onLongPress,
- required this.style,
- required this.focusNode,
- required this.autofocus,
- required this.clipBehavior,
- required this.child,
+ Key key,
+ @required this.onPressed,
+ @required this.onLongPress,
+ @required this.style,
+ @required this.focusNode,
+ @required this.autofocus,
+ @required this.clipBehavior,
+ @required this.child,
}) : assert(autofocus != null),
assert(clipBehavior != null),
super(key: key);
@@ -49,7 +51,7 @@
/// See also:
///
/// * [enabled], which is true if the button is enabled.
- final VoidCallback? onPressed;
+ final VoidCallback onPressed;
/// Called when the button is long-pressed.
///
@@ -58,7 +60,7 @@
/// See also:
///
/// * [enabled], which is true if the button is enabled.
- final VoidCallback? onLongPress;
+ final VoidCallback onLongPress;
/// Customizes this button's appearance.
///
@@ -68,7 +70,7 @@
/// [MaterialStateProperty]s in [themeStyleOf] and [defaultStyleOf].
///
/// Null by default.
- final ButtonStyle? style;
+ final ButtonStyle style;
/// {@macro flutter.widgets.Clip}
///
@@ -76,13 +78,13 @@
final Clip clipBehavior;
/// {@macro flutter.widgets.Focus.focusNode}
- final FocusNode? focusNode;
+ final FocusNode focusNode;
/// {@macro flutter.widgets.Focus.autofocus}
final bool autofocus;
/// Typically the button's label.
- final Widget? child;
+ final Widget child;
/// Returns a non-null [ButtonStyle] that's based primarily on the [Theme]'s
/// [ThemeData.textTheme] and [ThemeData.colorScheme].
@@ -115,7 +117,7 @@
///
/// * [defaultStyleOf], Returns the default [ButtonStyle] for this button.
@protected
- ButtonStyle? themeStyleOf(BuildContext context);
+ ButtonStyle themeStyleOf(BuildContext context);
/// Whether the button is enabled or disabled.
///
@@ -137,7 +139,7 @@
/// Returns null if [value] is null, otherwise `MaterialStateProperty.all<T>(value)`.
///
/// A convenience method for subclasses.
- static MaterialStateProperty<T>? allOrNull<T>(T? value) => value == null ? null : MaterialStateProperty.all<T>(value);
+ static MaterialStateProperty<T> allOrNull<T>(T value) => value == null ? null : MaterialStateProperty.all<T>(value);
/// Returns an interpolated value based on the [textScaleFactor] parameter:
///
@@ -163,9 +165,9 @@
} else if (textScaleFactor >= 3) {
return geometry3x;
} else if (textScaleFactor <= 2) {
- return EdgeInsetsGeometry.lerp(geometry1x, geometry2x, textScaleFactor - 1)!;
+ return EdgeInsetsGeometry.lerp(geometry1x, geometry2x, textScaleFactor - 1);
}
- return EdgeInsetsGeometry.lerp(geometry2x, geometry3x, textScaleFactor - 2)!;
+ return EdgeInsetsGeometry.lerp(geometry2x, geometry3x, textScaleFactor - 2);
}
}
@@ -178,9 +180,9 @@
/// * [ElevatedButton], a filled button whose material elevates when pressed.
/// * [OutlinedButton], similar to [TextButton], but with an outline.
class _ButtonStyleState extends State<ButtonStyleButton> with TickerProviderStateMixin {
- AnimationController? _controller;
- double? _elevation;
- Color? _backgroundColor;
+ AnimationController _controller;
+ double _elevation;
+ Color _backgroundColor;
final Set<MaterialState> _states = <MaterialState>{};
bool get _hovered => _states.contains(MaterialState.hovered);
@@ -243,54 +245,54 @@
@override
Widget build(BuildContext context) {
- final ButtonStyle? widgetStyle = widget.style;
- final ButtonStyle? themeStyle = widget.themeStyleOf(context);
+ final ButtonStyle widgetStyle = widget.style;
+ final ButtonStyle themeStyle = widget.themeStyleOf(context);
final ButtonStyle defaultStyle = widget.defaultStyleOf(context);
assert(defaultStyle != null);
- T? effectiveValue<T>(T? Function(ButtonStyle? style) getProperty) {
- final T? widgetValue = getProperty(widgetStyle);
- final T? themeValue = getProperty(themeStyle);
- final T? defaultValue = getProperty(defaultStyle);
+ T effectiveValue<T>(T Function(ButtonStyle style) getProperty) {
+ final T widgetValue = getProperty(widgetStyle);
+ final T themeValue = getProperty(themeStyle);
+ final T defaultValue = getProperty(defaultStyle);
return widgetValue ?? themeValue ?? defaultValue;
}
- T? resolve<T>(MaterialStateProperty<T>? Function(ButtonStyle? style) getProperty) {
+ T resolve<T>(MaterialStateProperty<T> Function(ButtonStyle style) getProperty) {
return effectiveValue(
- (ButtonStyle? style) => getProperty(style)?.resolve(_states),
+ (ButtonStyle style) => getProperty(style)?.resolve(_states),
);
}
- final double? resolvedElevation = resolve<double>((ButtonStyle? style) => style?.elevation);
- final TextStyle? resolvedTextStyle = resolve<TextStyle>((ButtonStyle? style) => style?.textStyle);
- Color? resolvedBackgroundColor = resolve<Color>((ButtonStyle? style) => style?.backgroundColor);
- final Color? resolvedForegroundColor = resolve<Color>((ButtonStyle? style) => style?.foregroundColor);
- final Color? resolvedShadowColor = resolve<Color>((ButtonStyle? style) => style?.shadowColor);
- final EdgeInsetsGeometry? resolvedPadding = resolve<EdgeInsetsGeometry>((ButtonStyle? style) => style?.padding);
- final Size? resolvedMinimumSize = resolve<Size>((ButtonStyle? style) => style?.minimumSize);
- final BorderSide? resolvedSide = resolve<BorderSide>((ButtonStyle? style) => style?.side);
- final OutlinedBorder? resolvedShape = resolve<OutlinedBorder>((ButtonStyle? style) => style?.shape);
+ final double resolvedElevation = resolve<double>((ButtonStyle style) => style?.elevation);
+ final TextStyle resolvedTextStyle = resolve<TextStyle>((ButtonStyle style) => style?.textStyle);
+ Color resolvedBackgroundColor = resolve<Color>((ButtonStyle style) => style?.backgroundColor);
+ final Color resolvedForegroundColor = resolve<Color>((ButtonStyle style) => style?.foregroundColor);
+ final Color resolvedShadowColor = resolve<Color>((ButtonStyle style) => style?.shadowColor);
+ final EdgeInsetsGeometry resolvedPadding = resolve<EdgeInsetsGeometry>((ButtonStyle style) => style?.padding);
+ final Size resolvedMinimumSize = resolve<Size>((ButtonStyle style) => style?.minimumSize);
+ final BorderSide resolvedSide = resolve<BorderSide>((ButtonStyle style) => style?.side);
+ final OutlinedBorder resolvedShape = resolve<OutlinedBorder>((ButtonStyle style) => style?.shape);
final MaterialStateMouseCursor resolvedMouseCursor = _MouseCursor(
- (Set<MaterialState> states) => effectiveValue((ButtonStyle? style) => style?.mouseCursor?.resolve(states)),
+ (Set<MaterialState> states) => effectiveValue((ButtonStyle style) => style?.mouseCursor?.resolve(states)),
);
final MaterialStateProperty<Color> overlayColor = MaterialStateProperty.resolveWith<Color>(
- (Set<MaterialState> states) => effectiveValue((ButtonStyle? style) => style?.overlayColor?.resolve(states)),
+ (Set<MaterialState> states) => effectiveValue((ButtonStyle style) => style?.overlayColor?.resolve(states)),
);
- final VisualDensity? resolvedVisualDensity = effectiveValue((ButtonStyle? style) => style?.visualDensity);
- final MaterialTapTargetSize? resolvedTapTargetSize = effectiveValue((ButtonStyle? style) => style?.tapTargetSize);
- final Duration? resolvedAnimationDuration = effectiveValue((ButtonStyle? style) => style?.animationDuration);
- final bool? resolvedEnableFeedback = effectiveValue((ButtonStyle? style) => style?.enableFeedback);
- final Offset densityAdjustment = resolvedVisualDensity!.baseSizeAdjustment;
+ final VisualDensity resolvedVisualDensity = effectiveValue((ButtonStyle style) => style?.visualDensity);
+ final MaterialTapTargetSize resolvedTapTargetSize = effectiveValue((ButtonStyle style) => style?.tapTargetSize);
+ final Duration resolvedAnimationDuration = effectiveValue((ButtonStyle style) => style?.animationDuration);
+ final bool resolvedEnableFeedback = effectiveValue((ButtonStyle style) => style?.enableFeedback);
+ final Offset densityAdjustment = resolvedVisualDensity.baseSizeAdjustment;
final BoxConstraints effectiveConstraints = resolvedVisualDensity.effectiveConstraints(
BoxConstraints(
- minWidth: resolvedMinimumSize!.width,
+ minWidth: resolvedMinimumSize.width,
minHeight: resolvedMinimumSize.height,
),
);
- final EdgeInsetsGeometry padding = resolvedPadding!.add(
+ final EdgeInsetsGeometry padding = resolvedPadding.add(
EdgeInsets.only(
left: densityAdjustment.dx,
top: densityAdjustment.dy,
@@ -303,12 +305,12 @@
// elevation is changing, change the elevation first. Material implicitly
// animates its elevation but not its color. SKIA renders non-zero
// elevations as a shadow colored fill behind the Material's background.
- if (resolvedAnimationDuration! > Duration.zero
+ if (resolvedAnimationDuration > Duration.zero
&& _elevation != null
&& _backgroundColor != null
&& _elevation != resolvedElevation
- && _backgroundColor!.value != resolvedBackgroundColor!.value
- && _backgroundColor!.opacity == 1
+ && _backgroundColor.value != resolvedBackgroundColor.value
+ && _backgroundColor.opacity == 1
&& resolvedBackgroundColor.opacity < 1
&& resolvedElevation == 0) {
if (_controller?.duration != resolvedAnimationDuration) {
@@ -324,8 +326,8 @@
});
}
resolvedBackgroundColor = _backgroundColor; // Defer changing the background color.
- _controller!.value = 0;
- _controller!.forward();
+ _controller.value = 0;
+ _controller.forward();
}
_elevation = resolvedElevation;
_backgroundColor = resolvedBackgroundColor;
@@ -333,9 +335,9 @@
final Widget result = ConstrainedBox(
constraints: effectiveConstraints,
child: Material(
- elevation: resolvedElevation!,
+ elevation: resolvedElevation,
textStyle: resolvedTextStyle?.copyWith(color: resolvedForegroundColor),
- shape: resolvedShape!.copyWith(side: resolvedSide),
+ shape: resolvedShape.copyWith(side: resolvedSide),
color: resolvedBackgroundColor,
shadowColor: resolvedShadowColor,
type: resolvedBackgroundColor == null ? MaterialType.transparency : MaterialType.button,
@@ -372,7 +374,7 @@
);
Size minSize;
- switch (resolvedTapTargetSize!) {
+ switch (resolvedTapTargetSize) {
case MaterialTapTargetSize.padded:
minSize = Size(
kMinInteractiveDimension + densityAdjustment.dx,
@@ -404,7 +406,7 @@
final MaterialPropertyResolver<MouseCursor> resolveCallback;
@override
- MouseCursor? resolve(Set<MaterialState> states) => resolveCallback(states);
+ MouseCursor resolve(Set<MaterialState> states) => resolveCallback(states);
@override
String get debugDescription => 'ButtonStyleButton_MouseCursor';
@@ -417,9 +419,9 @@
/// "tap target", but not its material or its ink splashes.
class _InputPadding extends SingleChildRenderObjectWidget {
const _InputPadding({
- Key? key,
- Widget? child,
- required this.minSize,
+ Key key,
+ Widget child,
+ this.minSize,
}) : super(key: key, child: child);
final Size minSize;
@@ -436,7 +438,7 @@
}
class _RenderInputPadding extends RenderShiftedBox {
- _RenderInputPadding(this._minSize, [RenderBox? child]) : super(child);
+ _RenderInputPadding(this._minSize, [RenderBox child]) : super(child);
Size get minSize => _minSize;
Size _minSize;
@@ -450,28 +452,28 @@
@override
double computeMinIntrinsicWidth(double height) {
if (child != null)
- return math.max(child!.getMinIntrinsicWidth(height), minSize.width);
+ return math.max(child.getMinIntrinsicWidth(height), minSize.width);
return 0.0;
}
@override
double computeMinIntrinsicHeight(double width) {
if (child != null)
- return math.max(child!.getMinIntrinsicHeight(width), minSize.height);
+ return math.max(child.getMinIntrinsicHeight(width), minSize.height);
return 0.0;
}
@override
double computeMaxIntrinsicWidth(double height) {
if (child != null)
- return math.max(child!.getMaxIntrinsicWidth(height), minSize.width);
+ return math.max(child.getMaxIntrinsicWidth(height), minSize.width);
return 0.0;
}
@override
double computeMaxIntrinsicHeight(double width) {
if (child != null)
- return math.max(child!.getMaxIntrinsicHeight(width), minSize.height);
+ return math.max(child.getMaxIntrinsicHeight(width), minSize.height);
return 0.0;
}
@@ -479,29 +481,29 @@
void performLayout() {
final BoxConstraints constraints = this.constraints;
if (child != null) {
- child!.layout(constraints, parentUsesSize: true);
- final double height = math.max(child!.size.width, minSize.width);
- final double width = math.max(child!.size.height, minSize.height);
+ child.layout(constraints, parentUsesSize: true);
+ final double height = math.max(child.size.width, minSize.width);
+ final double width = math.max(child.size.height, minSize.height);
size = constraints.constrain(Size(height, width));
- final BoxParentData childParentData = child!.parentData as BoxParentData;
- childParentData.offset = Alignment.center.alongOffset(size - child!.size as Offset);
+ final BoxParentData childParentData = child.parentData as BoxParentData;
+ childParentData.offset = Alignment.center.alongOffset(size - child.size as Offset);
} else {
size = Size.zero;
}
}
@override
- bool hitTest(BoxHitTestResult result, { required Offset position }) {
+ bool hitTest(BoxHitTestResult result, { Offset position }) {
if (super.hitTest(result, position: position)) {
return true;
}
- final Offset center = child!.size.center(Offset.zero);
+ final Offset center = child.size.center(Offset.zero);
return result.addWithRawTransform(
transform: MatrixUtils.forceToPoint(center),
position: center,
- hitTest: (BoxHitTestResult result, Offset? position) {
+ hitTest: (BoxHitTestResult result, Offset position) {
assert(position == center);
- return child!.hitTest(result, position: center);
+ return child.hitTest(result, position: center);
},
);
}
diff --git a/packages/flutter/lib/src/material/button_theme.dart b/packages/flutter/lib/src/material/button_theme.dart
index db932cb..00954de 100644
--- a/packages/flutter/lib/src/material/button_theme.dart
+++ b/packages/flutter/lib/src/material/button_theme.dart
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// @dart = 2.8
+
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
@@ -79,23 +81,23 @@
/// The [textTheme], [minWidth], [height], and [colorScheme] arguments
/// must not be null.
ButtonTheme({
- Key? key,
+ Key key,
ButtonTextTheme textTheme = ButtonTextTheme.normal,
ButtonBarLayoutBehavior layoutBehavior = ButtonBarLayoutBehavior.padded,
double minWidth = 88.0,
double height = 36.0,
- EdgeInsetsGeometry? padding,
- ShapeBorder? shape,
+ EdgeInsetsGeometry padding,
+ ShapeBorder shape,
bool alignedDropdown = false,
- Color? buttonColor,
- Color? disabledColor,
- Color? focusColor,
- Color? hoverColor,
- Color? highlightColor,
- Color? splashColor,
- ColorScheme? colorScheme,
- MaterialTapTargetSize? materialTapTargetSize,
- required Widget child,
+ Color buttonColor,
+ Color disabledColor,
+ Color focusColor,
+ Color hoverColor,
+ Color highlightColor,
+ Color splashColor,
+ ColorScheme colorScheme,
+ MaterialTapTargetSize materialTapTargetSize,
+ Widget child,
}) : assert(textTheme != null),
assert(minWidth != null && minWidth >= 0.0),
assert(height != null && height >= 0.0),
@@ -124,9 +126,9 @@
///
/// The [data] argument must not be null.
const ButtonTheme.fromButtonThemeData({
- Key? key,
- required this.data,
- required Widget child,
+ Key key,
+ @required this.data,
+ Widget child,
}) : assert(data != null),
super(key: key, child: child);
@@ -175,21 +177,21 @@
'This feature was deprecated after v1.9.1.'
)
ButtonTheme.bar({
- Key? key,
+ Key key,
ButtonTextTheme textTheme = ButtonTextTheme.accent,
double minWidth = 64.0,
double height = 36.0,
EdgeInsetsGeometry padding = const EdgeInsets.symmetric(horizontal: 8.0),
- ShapeBorder? shape,
+ ShapeBorder shape,
bool alignedDropdown = false,
- Color? buttonColor,
- Color? disabledColor,
- Color? focusColor,
- Color? hoverColor,
- Color? highlightColor,
- Color? splashColor,
- ColorScheme? colorScheme,
- required Widget child,
+ Color buttonColor,
+ Color disabledColor,
+ Color focusColor,
+ Color hoverColor,
+ Color highlightColor,
+ Color splashColor,
+ ColorScheme colorScheme,
+ Widget child,
ButtonBarLayoutBehavior layoutBehavior = ButtonBarLayoutBehavior.padded,
}) : assert(textTheme != null),
assert(minWidth != null && minWidth >= 0.0),
@@ -224,10 +226,10 @@
/// ButtonThemeData theme = ButtonTheme.of(context);
/// ```
static ButtonThemeData of(BuildContext context) {
- final ButtonTheme? inheritedButtonTheme = context.dependOnInheritedWidgetOfExactType<ButtonTheme>();
- ButtonThemeData? buttonTheme = inheritedButtonTheme?.data;
+ final ButtonTheme inheritedButtonTheme = context.dependOnInheritedWidgetOfExactType<ButtonTheme>();
+ ButtonThemeData buttonTheme = inheritedButtonTheme?.data;
if (buttonTheme?.colorScheme == null) { // if buttonTheme or buttonTheme.colorScheme is null
- final ThemeData theme = Theme.of(context)!;
+ final ThemeData theme = Theme.of(context);
buttonTheme ??= theme.buttonTheme;
if (buttonTheme.colorScheme == null) {
buttonTheme = buttonTheme.copyWith(
@@ -236,12 +238,12 @@
assert(buttonTheme.colorScheme != null);
}
}
- return buttonTheme!;
+ return buttonTheme;
}
@override
Widget wrap(BuildContext context, Widget child) {
- final ButtonTheme? ancestorTheme = context.findAncestorWidgetOfExactType<ButtonTheme>();
+ final ButtonTheme ancestorTheme = context.findAncestorWidgetOfExactType<ButtonTheme>();
return identical(this, ancestorTheme) ? child : ButtonTheme.fromButtonThemeData(data: data, child: child);
}
@@ -287,18 +289,18 @@
this.textTheme = ButtonTextTheme.normal,
this.minWidth = 88.0,
this.height = 36.0,
- EdgeInsetsGeometry? padding,
- ShapeBorder? shape,
+ EdgeInsetsGeometry padding,
+ ShapeBorder shape,
this.layoutBehavior = ButtonBarLayoutBehavior.padded,
this.alignedDropdown = false,
- Color? buttonColor,
- Color? disabledColor,
- Color? focusColor,
- Color? hoverColor,
- Color? highlightColor,
- Color? splashColor,
+ Color buttonColor,
+ Color disabledColor,
+ Color focusColor,
+ Color hoverColor,
+ Color highlightColor,
+ Color splashColor,
this.colorScheme,
- MaterialTapTargetSize? materialTapTargetSize,
+ MaterialTapTargetSize materialTapTargetSize,
}) : assert(textTheme != null),
assert(minWidth != null && minWidth >= 0.0),
assert(height != null && height >= 0.0),
@@ -367,7 +369,7 @@
/// and [FlatButton].
EdgeInsetsGeometry get padding {
if (_padding != null)
- return _padding!;
+ return _padding;
switch (textTheme) {
case ButtonTextTheme.normal:
case ButtonTextTheme.accent:
@@ -375,8 +377,10 @@
case ButtonTextTheme.primary:
return const EdgeInsets.symmetric(horizontal: 24.0);
}
+ assert(false);
+ return EdgeInsets.zero;
}
- final EdgeInsetsGeometry? _padding;
+ final EdgeInsetsGeometry _padding;
/// The shape of a button's material.
///
@@ -394,7 +398,7 @@
/// and [FlatButton].
ShapeBorder get shape {
if (_shape != null)
- return _shape!;
+ return _shape;
switch (textTheme) {
case ButtonTextTheme.normal:
case ButtonTextTheme.accent:
@@ -406,8 +410,9 @@
borderRadius: BorderRadius.all(Radius.circular(4.0)),
);
}
+ return const RoundedRectangleBorder();
}
- final ShapeBorder? _shape;
+ final ShapeBorder _shape;
/// If true, then a [DropdownButton] menu's width will match the button's
/// width.
@@ -432,7 +437,7 @@
///
/// * [getFillColor], which is used by [RaisedButton] to compute its
/// background fill color.
- final Color? _buttonColor;
+ final Color _buttonColor;
/// The background fill color for disabled [RaisedButton]s.
///
@@ -442,7 +447,7 @@
///
/// * [getDisabledFillColor], which is used by [RaisedButton] to compute its
/// background fill color.
- final Color? _disabledColor;
+ final Color _disabledColor;
/// The fill color of the button when it has the input focus.
///
@@ -455,7 +460,7 @@
///
/// * [getFocusColor], which is used by [RaisedButton], [OutlineButton]
/// and [FlatButton].
- final Color? _focusColor;
+ final Color _focusColor;
/// The fill color of the button when a pointer is hovering over it.
///
@@ -468,7 +473,7 @@
///
/// * [getHoverColor], which is used by [RaisedButton], [OutlineButton]
/// and [FlatButton].
- final Color? _hoverColor;
+ final Color _hoverColor;
/// The color of the overlay that appears when a button is pressed.
///
@@ -478,7 +483,7 @@
///
/// * [getHighlightColor], which is used by [RaisedButton], [OutlineButton]
/// and [FlatButton].
- final Color? _highlightColor;
+ final Color _highlightColor;
/// The color of the ink "splash" overlay that appears when a button is tapped.
///
@@ -488,7 +493,7 @@
///
/// * [getSplashColor], which is used by [RaisedButton], [OutlineButton]
/// and [FlatButton].
- final Color? _splashColor;
+ final Color _splashColor;
/// A set of thirteen colors that can be used to derive the button theme's
/// colors.
@@ -500,7 +505,7 @@
/// The colors for new button classes can be defined exclusively in terms
/// of [colorScheme]. When it's possible, the existing buttons will
/// (continue to) gradually migrate to it.
- final ColorScheme? colorScheme;
+ final ColorScheme colorScheme;
// The minimum size of a button's tap target.
//
@@ -510,14 +515,14 @@
//
// * [getMaterialTargetTapSize], which is used by [RaisedButton],
// [OutlineButton] and [FlatButton].
- final MaterialTapTargetSize? _materialTapTargetSize;
+ final MaterialTapTargetSize _materialTapTargetSize;
/// The [button]'s overall brightness.
///
/// Returns the button's [MaterialButton.colorBrightness] if it is non-null,
/// otherwise the color scheme's [ColorScheme.brightness] is returned.
Brightness getBrightness(MaterialButton button) {
- return button.colorBrightness ?? colorScheme!.brightness;
+ return button.colorBrightness ?? colorScheme.brightness;
}
/// Defines the [button]'s base colors, and the defaults for the button's
@@ -540,10 +545,10 @@
/// used as the `disabledTextColor`. It will be resolved in the [MaterialState.disabled] state.
Color getDisabledTextColor(MaterialButton button) {
if (button.textColor is MaterialStateProperty<Color>)
- return button.textColor!;
+ return button.textColor;
if (button.disabledTextColor != null)
- return button.disabledTextColor!;
- return colorScheme!.onSurface.withOpacity(0.38);
+ return button.disabledTextColor;
+ return colorScheme.onSurface.withOpacity(0.38);
}
/// The [button]'s background color when [MaterialButton.onPressed] is null
@@ -558,10 +563,10 @@
/// with its opacity set to 0.38.
Color getDisabledFillColor(MaterialButton button) {
if (button.disabledColor != null)
- return button.disabledColor!;
+ return button.disabledColor;
if (_disabledColor != null)
- return _disabledColor!;
- return colorScheme!.onSurface.withOpacity(0.38);
+ return _disabledColor;
+ return colorScheme.onSurface.withOpacity(0.38);
}
/// The button's background fill color or null for buttons that don't have
@@ -589,8 +594,8 @@
/// otherwise the color scheme's ColorScheme.primary color. If the button
/// is not enabled then the colorScheme's [ColorScheme.onSurface] color
/// with opacity 0.12.
- Color? getFillColor(MaterialButton button) {
- final Color? fillColor = button.enabled ? button.color : button.disabledColor;
+ Color getFillColor(MaterialButton button) {
+ final Color fillColor = button.enabled ? button.color : button.disabledColor;
if (fillColor != null)
return fillColor;
@@ -603,12 +608,15 @@
switch (getTextTheme(button)) {
case ButtonTextTheme.normal:
case ButtonTextTheme.accent:
- return button.enabled ? colorScheme!.primary : getDisabledFillColor(button);
+ return button.enabled ? colorScheme.primary : getDisabledFillColor(button);
case ButtonTextTheme.primary:
return button.enabled
- ? _buttonColor ?? colorScheme!.primary
- : colorScheme!.onSurface.withOpacity(0.12);
+ ? _buttonColor ?? colorScheme.primary
+ : colorScheme.onSurface.withOpacity(0.12);
}
+
+ assert(false);
+ return null;
}
/// The foreground color of the [button]'s text and icon.
@@ -633,26 +641,29 @@
return getDisabledTextColor(button);
if (button.textColor != null)
- return button.textColor!;
+ return button.textColor;
switch (getTextTheme(button)) {
case ButtonTextTheme.normal:
return getBrightness(button) == Brightness.dark ? Colors.white : Colors.black87;
case ButtonTextTheme.accent:
- return colorScheme!.secondary;
+ return colorScheme.secondary;
case ButtonTextTheme.primary:
- final Color? fillColor = getFillColor(button);
+ final Color fillColor = getFillColor(button);
final bool fillIsDark = fillColor != null
? ThemeData.estimateBrightnessForColor(fillColor) == Brightness.dark
: getBrightness(button) == Brightness.dark;
if (fillIsDark)
return Colors.white;
if (button is FlatButton || button is OutlineButton)
- return colorScheme!.primary;
+ return colorScheme.primary;
return Colors.black;
}
+
+ assert(false);
+ return null;
}
/// The color of the ink "splash" overlay that appears when the (enabled)
@@ -670,16 +681,16 @@
/// Otherwise, returns [getTextColor] with an opacity of 0.12.
Color getSplashColor(MaterialButton button) {
if (button.splashColor != null)
- return button.splashColor!;
+ return button.splashColor;
if (_splashColor != null && (button is RaisedButton || button is OutlineButton))
- return _splashColor!;
+ return _splashColor;
if (_splashColor != null && button is FlatButton) {
switch (getTextTheme(button)) {
case ButtonTextTheme.normal:
case ButtonTextTheme.accent:
- return _splashColor!;
+ return _splashColor;
case ButtonTextTheme.primary:
break;
}
@@ -725,7 +736,7 @@
/// * [ButtonTextTheme.primary], returns [Colors.transparent].
Color getHighlightColor(MaterialButton button) {
if (button.highlightColor != null)
- return button.highlightColor!;
+ return button.highlightColor;
switch (getTextTheme(button)) {
case ButtonTextTheme.normal:
@@ -734,6 +745,9 @@
case ButtonTextTheme.primary:
return Colors.transparent;
}
+
+ assert(false);
+ return Colors.transparent;
}
/// The [button]'s elevation when it is enabled and has not been pressed.
@@ -743,7 +757,7 @@
/// If button is a [FlatButton] then elevation is 0.0, otherwise it is 2.0.
double getElevation(MaterialButton button) {
if (button.elevation != null)
- return button.elevation!;
+ return button.elevation;
if (button is FlatButton)
return 0.0;
return 2.0;
@@ -757,7 +771,7 @@
/// elevation is 0.0, otherwise the highlight elevation is 4.0.
double getFocusElevation(MaterialButton button) {
if (button.focusElevation != null)
- return button.focusElevation!;
+ return button.focusElevation;
if (button is FlatButton)
return 0.0;
if (button is OutlineButton)
@@ -773,7 +787,7 @@
/// elevation is 0.0, otherwise the highlight elevation is 4.0.
double getHoverElevation(MaterialButton button) {
if (button.hoverElevation != null)
- return button.hoverElevation!;
+ return button.hoverElevation;
if (button is FlatButton)
return 0.0;
if (button is OutlineButton)
@@ -789,7 +803,7 @@
/// elevation is 0.0, otherwise the highlight elevation is 8.0.
double getHighlightElevation(MaterialButton button) {
if (button.highlightElevation != null)
- return button.highlightElevation!;
+ return button.highlightElevation;
if (button is FlatButton)
return 0.0;
if (button is OutlineButton)
@@ -805,7 +819,7 @@
/// Otherwise the disabled elevation is 0.0.
double getDisabledElevation(MaterialButton button) {
if (button.disabledElevation != null)
- return button.disabledElevation!;
+ return button.disabledElevation;
return 0.0;
}
@@ -824,13 +838,13 @@
/// otherwise.
EdgeInsetsGeometry getPadding(MaterialButton button) {
if (button.padding != null)
- return button.padding!;
+ return button.padding;
if (button is MaterialButtonWithIconMixin)
return const EdgeInsetsDirectional.only(start: 12.0, end: 16.0);
if (_padding != null)
- return _padding!;
+ return _padding;
switch (getTextTheme(button)) {
case ButtonTextTheme.normal:
@@ -839,6 +853,8 @@
case ButtonTextTheme.primary:
return const EdgeInsets.symmetric(horizontal: 24.0);
}
+ assert(false);
+ return EdgeInsets.zero;
}
/// The shape of the [button]'s [Material].
@@ -879,21 +895,21 @@
/// Creates a copy of this button theme data object with the matching fields
/// replaced with the non-null parameter values.
ButtonThemeData copyWith({
- ButtonTextTheme? textTheme,
- ButtonBarLayoutBehavior? layoutBehavior,
- double? minWidth,
- double? height,
- EdgeInsetsGeometry? padding,
- ShapeBorder? shape,
- bool? alignedDropdown,
- Color? buttonColor,
- Color? disabledColor,
- Color? focusColor,
- Color? hoverColor,
- Color? highlightColor,
- Color? splashColor,
- ColorScheme? colorScheme,
- MaterialTapTargetSize? materialTapTargetSize,
+ ButtonTextTheme textTheme,
+ ButtonBarLayoutBehavior layoutBehavior,
+ double minWidth,
+ double height,
+ EdgeInsetsGeometry padding,
+ ShapeBorder shape,
+ bool alignedDropdown,
+ Color buttonColor,
+ Color disabledColor,
+ Color focusColor,
+ Color hoverColor,
+ Color highlightColor,
+ Color splashColor,
+ ColorScheme colorScheme,
+ MaterialTapTargetSize materialTapTargetSize,
}) {
return ButtonThemeData(
textTheme: textTheme ?? this.textTheme,
diff --git a/packages/flutter/lib/src/material/material_button.dart b/packages/flutter/lib/src/material/material_button.dart
index 9e055cf..3b84176 100644
--- a/packages/flutter/lib/src/material/material_button.dart
+++ b/packages/flutter/lib/src/material/material_button.dart
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// @dart = 2.8
+
import 'dart:ui';
import 'package:flutter/foundation.dart';
@@ -63,8 +65,8 @@
/// [highlightElevation], and [disabledElevation] must be non-negative, if
/// specified.
const MaterialButton({
- Key? key,
- required this.onPressed,
+ Key key,
+ @required this.onPressed,
this.onLongPress,
this.onHighlightChanged,
this.mouseCursor,
@@ -111,7 +113,7 @@
/// See also:
///
/// * [enabled], which is true if the button is enabled.
- final VoidCallback? onPressed;
+ final VoidCallback onPressed;
/// The callback that is called when the button is long-pressed.
///
@@ -120,7 +122,7 @@
/// See also:
///
/// * [enabled], which is true if the button is enabled.
- final VoidCallback? onLongPress;
+ final VoidCallback onLongPress;
/// Called by the underlying [InkWell] widget's [InkWell.onHighlightChanged]
/// callback.
@@ -128,16 +130,16 @@
/// If [onPressed] changes from null to non-null while a gesture is ongoing,
/// this can fire during the build phase (in which case calling
/// [State.setState] is not allowed).
- final ValueChanged<bool>? onHighlightChanged;
+ final ValueChanged<bool> onHighlightChanged;
/// {@macro flutter.material.button.mouseCursor}
- final MouseCursor? mouseCursor;
+ final MouseCursor mouseCursor;
/// Defines the button's base colors, and the defaults for the button's minimum
/// size, internal padding, and shape.
///
/// Defaults to `ButtonTheme.of(context).textTheme`.
- final ButtonTextTheme? textTheme;
+ final ButtonTextTheme textTheme;
/// The color to use for this button's text.
///
@@ -155,7 +157,7 @@
///
/// * [disabledTextColor], the text color to use when the button has been
/// disabled.
- final Color? textColor;
+ final Color textColor;
/// The color to use for this button's text when the button is disabled.
///
@@ -172,7 +174,7 @@
/// See also:
///
/// * [textColor] - The color to use for this button's text when the button is [enabled].
- final Color? disabledTextColor;
+ final Color disabledTextColor;
/// The button's fill color, displayed by its [Material], while it
/// is in its default (unpressed, [enabled]) state.
@@ -182,7 +184,7 @@
/// See also:
///
/// * [disabledColor] - the fill color of the button when the button is disabled.
- final Color? color;
+ final Color color;
/// The fill color of the button when the button is disabled.
///
@@ -192,7 +194,7 @@
/// See also:
///
/// * [color] - the fill color of the button when the button is [enabled].
- final Color? disabledColor;
+ final Color disabledColor;
/// The splash color of the button's [InkWell].
///
@@ -205,20 +207,20 @@
///
/// The appearance of the splash can be configured with the theme's splash
/// factory, [ThemeData.splashFactory].
- final Color? splashColor;
+ final Color splashColor;
/// The fill color of the button's [Material] when it has the input focus.
///
/// The button changed focus color when the button has the input focus. It
/// appears behind the button's child.
- final Color? focusColor;
+ final Color focusColor;
/// The fill color of the button's [Material] when a pointer is hovering over
/// it.
///
/// The button changes fill color when a pointer is hovering over the button.
/// It appears behind the button's child.
- final Color? hoverColor;
+ final Color hoverColor;
/// The highlight color of the button's [InkWell].
///
@@ -229,7 +231,7 @@
/// If [textTheme] is [ButtonTextTheme.primary], the default highlight color is
/// transparent (in other words the highlight doesn't appear). Otherwise it's
/// the current theme's highlight color, [ThemeData.highlightColor].
- final Color? highlightColor;
+ final Color highlightColor;
/// The z-coordinate at which to place this button relative to its parent.
///
@@ -246,7 +248,7 @@
/// button.
/// * [disabledElevation], the elevation when the button is disabled.
/// * [highlightElevation], the elevation when the button is pressed.
- final double? elevation;
+ final double elevation;
/// The elevation for the button's [Material] when the button
/// is [enabled] and a pointer is hovering over it.
@@ -259,7 +261,7 @@
/// * [focusElevation], the elevation when the button is focused.
/// * [disabledElevation], the elevation when the button is disabled.
/// * [highlightElevation], the elevation when the button is pressed.
- final double? hoverElevation;
+ final double hoverElevation;
/// The elevation for the button's [Material] when the button
/// is [enabled] and has the input focus.
@@ -273,7 +275,7 @@
/// button.
/// * [disabledElevation], the elevation when the button is disabled.
/// * [highlightElevation], the elevation when the button is pressed.
- final double? focusElevation;
+ final double focusElevation;
/// The elevation for the button's [Material] relative to its parent when the
/// button is [enabled] and pressed.
@@ -291,7 +293,7 @@
/// * [hoverElevation], the elevation when a pointer is hovering over the
/// button.
/// * [disabledElevation], the elevation when the button is disabled.
- final double? highlightElevation;
+ final double highlightElevation;
/// The elevation for the button's [Material] relative to its parent when the
/// button is not [enabled].
@@ -302,7 +304,7 @@
///
/// * [elevation], the default elevation.
/// * [highlightElevation], the elevation when the button is pressed.
- final double? disabledElevation;
+ final double disabledElevation;
/// The theme brightness to use for this button.
///
@@ -313,12 +315,12 @@
/// See also:
///
/// * [ButtonTextTheme], uses [Brightness] to determine text color.
- final Brightness? colorBrightness;
+ final Brightness colorBrightness;
/// The button's label.
///
/// Often a [Text] widget in all caps.
- final Widget? child;
+ final Widget child;
/// Whether the button is enabled or disabled.
///
@@ -330,7 +332,7 @@
///
/// Defaults to the value from the current [ButtonTheme],
/// [ButtonThemeData.padding].
- final EdgeInsetsGeometry? padding;
+ final EdgeInsetsGeometry padding;
/// Defines how compact the button's layout will be.
///
@@ -340,7 +342,7 @@
///
/// * [ThemeData.visualDensity], which specifies the [visualDensity] for all
/// widgets within a [Theme].
- final VisualDensity? visualDensity;
+ final VisualDensity visualDensity;
/// The shape of the button's [Material].
///
@@ -350,7 +352,7 @@
///
/// Defaults to the value from the current [ButtonTheme],
/// [ButtonThemeData.shape].
- final ShapeBorder? shape;
+ final ShapeBorder shape;
/// {@macro flutter.widgets.Clip}
///
@@ -358,7 +360,7 @@
final Clip clipBehavior;
/// {@macro flutter.widgets.Focus.focusNode}
- final FocusNode? focusNode;
+ final FocusNode focusNode;
/// {@macro flutter.widgets.Focus.autofocus}
final bool autofocus;
@@ -366,7 +368,7 @@
/// Defines the duration of animated changes for [shape] and [elevation].
///
/// The default value is [kThemeChangeDuration].
- final Duration? animationDuration;
+ final Duration animationDuration;
/// Configures the minimum size of the tap target.
///
@@ -375,17 +377,17 @@
/// See also:
///
/// * [MaterialTapTargetSize], for a description of how this affects tap targets.
- final MaterialTapTargetSize? materialTapTargetSize;
+ final MaterialTapTargetSize materialTapTargetSize;
/// The smallest horizontal extent that the button will occupy.
///
/// Defaults to the value from the current [ButtonTheme].
- final double? minWidth;
+ final double minWidth;
/// The vertical extent of the button.
///
/// Defaults to the value from the current [ButtonTheme].
- final double? height;
+ final double height;
/// Whether detected gestures should provide acoustic and/or haptic feedback.
///
@@ -399,7 +401,7 @@
@override
Widget build(BuildContext context) {
- final ThemeData theme = Theme.of(context)!;
+ final ThemeData theme = Theme.of(context);
final ButtonThemeData buttonTheme = ButtonTheme.of(context);
return RawMaterialButton(
@@ -409,9 +411,9 @@
onHighlightChanged: onHighlightChanged,
mouseCursor: mouseCursor,
fillColor: buttonTheme.getFillColor(this),
- textStyle: theme.textTheme.button!.copyWith(color: buttonTheme.getTextColor(this)),
- focusColor: focusColor ?? buttonTheme.getFocusColor(this),
- hoverColor: hoverColor ?? buttonTheme.getHoverColor(this),
+ textStyle: theme.textTheme.button.copyWith(color: buttonTheme.getTextColor(this)),
+ focusColor: focusColor ?? buttonTheme.getFocusColor(this) ?? theme.focusColor,
+ hoverColor: hoverColor ?? buttonTheme.getHoverColor(this) ?? theme.hoverColor,
highlightColor: highlightColor ?? theme.highlightColor,
splashColor: splashColor ?? theme.splashColor,
elevation: buttonTheme.getElevation(this),
diff --git a/packages/flutter/lib/src/material/scaffold.dart b/packages/flutter/lib/src/material/scaffold.dart
index 6369cce..e429b55 100644
--- a/packages/flutter/lib/src/material/scaffold.dart
+++ b/packages/flutter/lib/src/material/scaffold.dart
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// @dart = 2.8
+
import 'dart:async';
import 'dart:collection';
import 'dart:math' as math;
@@ -73,15 +75,15 @@
/// Abstract const constructor. This constructor enables subclasses to provide
/// const constructors so that they can be used in const expressions.
const ScaffoldPrelayoutGeometry({
- required this.bottomSheetSize,
- required this.contentBottom,
- required this.contentTop,
- required this.floatingActionButtonSize,
- required this.minInsets,
- required this.minViewPadding,
- required this.scaffoldSize,
- required this.snackBarSize,
- required this.textDirection,
+ @required this.bottomSheetSize,
+ @required this.contentBottom,
+ @required this.contentTop,
+ @required this.floatingActionButtonSize,
+ @required this.minInsets,
+ @required this.minViewPadding,
+ @required this.scaffoldSize,
+ @required this.snackBarSize,
+ @required this.textDirection,
});
/// The [Size] of [Scaffold.floatingActionButton].
@@ -223,12 +225,12 @@
/// rectangle in which the [Scaffold.bottomNavigationBar] bar is laid out.
///
/// Null if [Scaffold.bottomNavigationBar] is null.
- final double? bottomNavigationBarTop;
+ final double bottomNavigationBarTop;
/// The [Scaffold.floatingActionButton]'s bounding rectangle.
///
/// This is null when there is no floating action button showing.
- final Rect? floatingActionButtonArea;
+ final Rect floatingActionButtonArea;
ScaffoldGeometry _scaleFloatingActionButton(double scaleFactor) {
if (scaleFactor == 1.0)
@@ -241,18 +243,18 @@
}
final Rect scaledButton = Rect.lerp(
- floatingActionButtonArea!.center & Size.zero,
+ floatingActionButtonArea.center & Size.zero,
floatingActionButtonArea,
scaleFactor,
- )!;
+ );
return copyWith(floatingActionButtonArea: scaledButton);
}
/// Creates a copy of this [ScaffoldGeometry] but with the given fields replaced with
/// the new values.
ScaffoldGeometry copyWith({
- double? bottomNavigationBarTop,
- Rect? floatingActionButtonArea,
+ double bottomNavigationBarTop,
+ Rect floatingActionButtonArea,
}) {
return ScaffoldGeometry(
bottomNavigationBarTop: bottomNavigationBarTop ?? this.bottomNavigationBarTop,
@@ -266,14 +268,14 @@
: assert (context != null);
final BuildContext context;
- double? floatingActionButtonScale;
+ double floatingActionButtonScale;
ScaffoldGeometry geometry;
@override
ScaffoldGeometry get value {
assert(() {
- final RenderObject? renderObject = context.findRenderObject();
- if (renderObject == null || !renderObject.owner!.debugDoingPaint)
+ final RenderObject renderObject = context.findRenderObject();
+ if (renderObject == null || !renderObject.owner.debugDoingPaint)
throw FlutterError(
'Scaffold.geometryOf() must only be accessed during the paint phase.\n'
'The ScaffoldGeometry is only available during the paint phase, because '
@@ -281,13 +283,13 @@
);
return true;
}());
- return geometry._scaleFloatingActionButton(floatingActionButtonScale!);
+ return geometry._scaleFloatingActionButton(floatingActionButtonScale);
}
void _updateWith({
- double? bottomNavigationBarTop,
- Rect? floatingActionButtonArea,
- double? floatingActionButtonScale,
+ double bottomNavigationBarTop,
+ Rect floatingActionButtonArea,
+ double floatingActionButtonScale,
}) {
this.floatingActionButtonScale = floatingActionButtonScale ?? this.floatingActionButtonScale;
geometry = geometry.copyWith(
@@ -313,8 +315,8 @@
double maxWidth = double.infinity,
double minHeight = 0.0,
double maxHeight = double.infinity,
- required this.bottomWidgetsHeight,
- required this.appBarHeight,
+ @required this.bottomWidgetsHeight,
+ @required this.appBarHeight,
}) : assert(bottomWidgetsHeight != null),
assert(bottomWidgetsHeight >= 0),
assert(appBarHeight != null),
@@ -351,10 +353,10 @@
// The constraints parameter is constructed in_ScaffoldLayout.performLayout().
class _BodyBuilder extends StatelessWidget {
const _BodyBuilder({
- Key? key,
- required this.extendBody,
- required this.extendBodyBehindAppBar,
- required this.body,
+ Key key,
+ @required this.extendBody,
+ @required this.extendBodyBehindAppBar,
+ @required this.body,
}) : assert(extendBody != null),
assert(extendBodyBehindAppBar != null),
assert(body != null),
@@ -372,7 +374,7 @@
return LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraints) {
final _BodyBoxConstraints bodyConstraints = constraints as _BodyBoxConstraints;
- final MediaQueryData metrics = MediaQuery.of(context)!;
+ final MediaQueryData metrics = MediaQuery.of(context);
final double bottom = extendBody
? math.max(metrics.padding.bottom, bodyConstraints.bottomWidgetsHeight)
@@ -398,19 +400,19 @@
class _ScaffoldLayout extends MultiChildLayoutDelegate {
_ScaffoldLayout({
- required this.minInsets,
- required this.minViewPadding,
- required this.textDirection,
- required this.geometryNotifier,
+ @required this.minInsets,
+ @required this.minViewPadding,
+ @required this.textDirection,
+ @required this.geometryNotifier,
// for floating action button
- required this.previousFloatingActionButtonLocation,
- required this.currentFloatingActionButtonLocation,
- required this.floatingActionButtonMoveAnimationProgress,
- required this.floatingActionButtonMotionAnimator,
- required this.isSnackBarFloating,
- required this.snackBarWidth,
- required this.extendBody,
- required this.extendBodyBehindAppBar,
+ @required this.previousFloatingActionButtonLocation,
+ @required this.currentFloatingActionButtonLocation,
+ @required this.floatingActionButtonMoveAnimationProgress,
+ @required this.floatingActionButtonMotionAnimator,
+ @required this.isSnackBarFloating,
+ @required this.snackBarWidth,
+ @required this.extendBody,
+ @required this.extendBodyBehindAppBar,
}) : assert(minInsets != null),
assert(textDirection != null),
assert(geometryNotifier != null),
@@ -432,7 +434,7 @@
final FloatingActionButtonAnimator floatingActionButtonMotionAnimator;
final bool isSnackBarFloating;
- final double? snackBarWidth;
+ final double snackBarWidth;
@override
void performLayout(Size size) {
@@ -455,7 +457,7 @@
positionChild(_ScaffoldSlot.appBar, Offset.zero);
}
- double? bottomNavigationBarTop;
+ double bottomNavigationBarTop;
if (hasChild(_ScaffoldSlot.bottomNavigationBar)) {
final double bottomNavigationBarHeight = layoutChild(_ScaffoldSlot.bottomNavigationBar, fullWidthConstraints).height;
bottomWidgetsHeight += bottomNavigationBarHeight;
@@ -535,7 +537,7 @@
positionChild(_ScaffoldSlot.bottomSheet, Offset((size.width - bottomSheetSize.width) / 2.0, contentBottom - bottomSheetSize.height));
}
- late Rect floatingActionButtonRect;
+ Rect floatingActionButtonRect;
if (hasChild(_ScaffoldSlot.floatingActionButton)) {
final Size fabSize = layoutChild(_ScaffoldSlot.floatingActionButton, looseConstraints);
@@ -564,7 +566,7 @@
}
if (hasChild(_ScaffoldSlot.snackBar)) {
- final bool hasCustomWidth = snackBarWidth != null && snackBarWidth! < size.width;
+ final bool hasCustomWidth = snackBarWidth != null && snackBarWidth < size.width;
if (snackBarSize == Size.zero) {
snackBarSize = layoutChild(
_ScaffoldSlot.snackBar,
@@ -587,7 +589,7 @@
: contentBottom;
}
- final double xOffset = hasCustomWidth ? (size.width - snackBarWidth!) / 2 : 0.0;
+ final double xOffset = hasCustomWidth ? (size.width - snackBarWidth) / 2 : 0.0;
positionChild(_ScaffoldSlot.snackBar, Offset(xOffset, snackBarYOffsetBase - snackBarSize.height));
}
@@ -634,18 +636,18 @@
/// when its [FloatingActionButtonLocation] is updated.
class _FloatingActionButtonTransition extends StatefulWidget {
const _FloatingActionButtonTransition({
- Key? key,
- required this.child,
- required this.fabMoveAnimation,
- required this.fabMotionAnimator,
- required this.geometryNotifier,
- required this.currentController,
+ Key key,
+ @required this.child,
+ @required this.fabMoveAnimation,
+ @required this.fabMotionAnimator,
+ @required this.geometryNotifier,
+ @required this.currentController,
}) : assert(fabMoveAnimation != null),
assert(fabMotionAnimator != null),
assert(currentController != null),
super(key: key);
- final Widget? child;
+ final Widget child;
final Animation<double> fabMoveAnimation;
final FloatingActionButtonAnimator fabMotionAnimator;
final _ScaffoldGeometryNotifier geometryNotifier;
@@ -660,14 +662,14 @@
class _FloatingActionButtonTransitionState extends State<_FloatingActionButtonTransition> with TickerProviderStateMixin {
// The animations applied to the Floating Action Button when it is entering or exiting.
// Controls the previous widget.child as it exits.
- late AnimationController _previousController;
- late Animation<double> _previousScaleAnimation;
- late Animation<double> _previousRotationAnimation;
+ AnimationController _previousController;
+ Animation<double> _previousScaleAnimation;
+ Animation<double> _previousRotationAnimation;
// The animations to run, considering the widget's fabMoveAnimation and the current/previous entrance/exit animations.
- late Animation<double> _currentScaleAnimation;
- late Animation<double> _extendedCurrentScaleAnimation;
- late Animation<double> _currentRotationAnimation;
- Widget? _previousChild;
+ Animation<double> _currentScaleAnimation;
+ Animation<double> _extendedCurrentScaleAnimation;
+ Animation<double> _currentRotationAnimation;
+ Widget _previousChild;
@override
void initState() {
@@ -778,7 +780,7 @@
});
}
- bool _isExtendedFloatingActionButton(Widget? widget) {
+ bool _isExtendedFloatingActionButton(Widget widget) {
return widget is FloatingActionButton
&& widget.isExtended;
}
@@ -1023,7 +1025,7 @@
class Scaffold extends StatefulWidget {
/// Creates a visual scaffold for material design widgets.
const Scaffold({
- Key? key,
+ Key key,
this.appBar,
this.body,
this.floatingActionButton,
@@ -1087,7 +1089,7 @@
final bool extendBodyBehindAppBar;
/// An app bar to display at the top of the scaffold.
- final PreferredSizeWidget? appBar;
+ final PreferredSizeWidget appBar;
/// The primary content of the scaffold.
///
@@ -1107,22 +1109,22 @@
/// but may overflow and would in such cases need to scroll, consider using a
/// [ListView] as the body of the scaffold. This is also a good choice for
/// the case where your body is a scrollable list.
- final Widget? body;
+ final Widget body;
/// A button displayed floating above [body], in the bottom right corner.
///
/// Typically a [FloatingActionButton].
- final Widget? floatingActionButton;
+ final Widget floatingActionButton;
/// Responsible for determining where the [floatingActionButton] should go.
///
/// If null, the [ScaffoldState] will use the default location, [FloatingActionButtonLocation.endFloat].
- final FloatingActionButtonLocation? floatingActionButtonLocation;
+ final FloatingActionButtonLocation floatingActionButtonLocation;
/// Animator to move the [floatingActionButton] to a new [floatingActionButtonLocation].
///
/// If null, the [ScaffoldState] will use the default animator, [FloatingActionButtonAnimator.scaling].
- final FloatingActionButtonAnimator? floatingActionButtonAnimator;
+ final FloatingActionButtonAnimator floatingActionButtonAnimator;
/// A set of buttons that are displayed at the bottom of the scaffold.
///
@@ -1133,7 +1135,7 @@
///
/// The [persistentFooterButtons] are rendered above the
/// [bottomNavigationBar] but below the [body].
- final List<Widget>? persistentFooterButtons;
+ final List<Widget> persistentFooterButtons;
/// A panel displayed to the side of the [body], often hidden on mobile
/// devices. Swipes in from either left-to-right ([TextDirection.ltr]) or
@@ -1193,7 +1195,7 @@
/// }
/// ```
/// {@end-tool}
- final Widget? drawer;
+ final Widget drawer;
/// A panel displayed to the side of the [body], often hidden on mobile
/// devices. Swipes in from right-to-left ([TextDirection.ltr]) or
@@ -1253,17 +1255,17 @@
/// }
/// ```
/// {@end-tool}
- final Widget? endDrawer;
+ final Widget endDrawer;
/// The color to use for the scrim that obscures primary content while a drawer is open.
///
/// By default, the color is [Colors.black54]
- final Color? drawerScrimColor;
+ final Color drawerScrimColor;
/// The color of the [Material] widget that underlies the entire Scaffold.
///
/// The theme's [ThemeData.scaffoldBackgroundColor] by default.
- final Color? backgroundColor;
+ final Color backgroundColor;
/// A bottom navigation bar to display at the bottom of the scaffold.
///
@@ -1272,7 +1274,7 @@
///
/// The [bottomNavigationBar] is rendered below the [persistentFooterButtons]
/// and the [body].
- final Widget? bottomNavigationBar;
+ final Widget bottomNavigationBar;
/// The persistent bottom sheet to display.
///
@@ -1303,7 +1305,7 @@
/// * [showBottomSheet], which displays a bottom sheet as a route that can
/// be dismissed with the scaffold's back button.
/// * [showModalBottomSheet], which displays a modal bottom sheet.
- final Widget? bottomSheet;
+ final Widget bottomSheet;
/// This flag is deprecated, please use [resizeToAvoidBottomInset]
/// instead.
@@ -1315,7 +1317,7 @@
'Use resizeToAvoidBottomInset to specify if the body should resize when the keyboard appears. '
'This feature was deprecated after v1.1.9.'
)
- final bool? resizeToAvoidBottomPadding;
+ final bool resizeToAvoidBottomPadding;
/// If true the [body] and the scaffold's floating widgets should size
/// themselves to avoid the onscreen keyboard whose height is defined by the
@@ -1326,7 +1328,7 @@
/// prevents widgets inside the body from being obscured by the keyboard.
///
/// Defaults to true.
- final bool? resizeToAvoidBottomInset;
+ final bool resizeToAvoidBottomInset;
/// Whether this scaffold is being displayed at the top of the screen.
///
@@ -1349,7 +1351,7 @@
/// not obscured. For example, if `TextDirection.of(context)` is set to
/// [TextDirection.ltr], 20.0 will be added to
/// `MediaQuery.of(context).padding.left`.
- final double? drawerEdgeDragWidth;
+ final double drawerEdgeDragWidth;
/// Determines if the [Scaffold.drawer] can be opened with a drag
/// gesture.
@@ -1465,10 +1467,10 @@
///
/// If there is no [Scaffold] in scope, then this will throw an exception.
/// To return null if there is no [Scaffold], then pass `nullOk: true`.
- static ScaffoldState? of(BuildContext context, { bool nullOk = false }) {
+ static ScaffoldState of(BuildContext context, { bool nullOk = false }) {
assert(nullOk != null);
assert(context != null);
- final ScaffoldState? result = context.findAncestorStateOfType<ScaffoldState>();
+ final ScaffoldState result = context.findAncestorStateOfType<ScaffoldState>();
if (nullOk || result != null)
return result;
throw FlutterError.fromParts(<DiagnosticsNode>[
@@ -1519,8 +1521,8 @@
/// return value with the previous listenable, if it has changed, unregister
/// the listener, and register a listener to the new [ScaffoldGeometry]
/// listenable.
- static ValueListenable<ScaffoldGeometry>? geometryOf(BuildContext context) {
- final _ScaffoldScope? scaffoldScope = context.dependOnInheritedWidgetOfExactType<_ScaffoldScope>();
+ static ValueListenable<ScaffoldGeometry> geometryOf(BuildContext context) {
+ final _ScaffoldScope scaffoldScope = context.dependOnInheritedWidgetOfExactType<_ScaffoldScope>();
if (scaffoldScope == null)
throw FlutterError.fromParts(<DiagnosticsNode>[
ErrorSummary(
@@ -1564,10 +1566,10 @@
assert(registerForUpdates != null);
assert(context != null);
if (registerForUpdates) {
- final _ScaffoldScope? scaffold = context.dependOnInheritedWidgetOfExactType<_ScaffoldScope>();
+ final _ScaffoldScope scaffold = context.dependOnInheritedWidgetOfExactType<_ScaffoldScope>();
return scaffold?.hasDrawer ?? false;
} else {
- final ScaffoldState? scaffold = context.findAncestorStateOfType<ScaffoldState>();
+ final ScaffoldState scaffold = context.findAncestorStateOfType<ScaffoldState>();
return scaffold?.hasDrawer ?? false;
}
}
@@ -1596,11 +1598,11 @@
/// Whether this scaffold has a non-null [Scaffold.floatingActionButton].
bool get hasFloatingActionButton => widget.floatingActionButton != null;
- double? _appBarMaxHeight;
+ double _appBarMaxHeight;
/// The max height the [Scaffold.appBar] uses.
///
/// This is based on the appBar preferred height plus the top padding.
- double? get appBarMaxHeight => _appBarMaxHeight;
+ double get appBarMaxHeight => _appBarMaxHeight;
bool _drawerOpened = false;
bool _endDrawerOpened = false;
@@ -1646,7 +1648,7 @@
/// See [Scaffold.of] for information about how to obtain the [ScaffoldState].
void openDrawer() {
if (_endDrawerKey.currentState != null && _endDrawerOpened)
- _endDrawerKey.currentState!.close();
+ _endDrawerKey.currentState.close();
_drawerKey.currentState?.open();
}
@@ -1664,16 +1666,16 @@
/// See [Scaffold.of] for information about how to obtain the [ScaffoldState].
void openEndDrawer() {
if (_drawerKey.currentState != null && _drawerOpened)
- _drawerKey.currentState!.close();
+ _drawerKey.currentState.close();
_endDrawerKey.currentState?.open();
}
// SNACKBAR API
final Queue<ScaffoldFeatureController<SnackBar, SnackBarClosedReason>> _snackBars = Queue<ScaffoldFeatureController<SnackBar, SnackBarClosedReason>>();
- AnimationController? _snackBarController;
- Timer? _snackBarTimer;
- bool? _accessibleNavigation;
+ AnimationController _snackBarController;
+ Timer _snackBarTimer;
+ bool _accessibleNavigation;
/// Shows a [SnackBar] at the bottom of the scaffold.
///
@@ -1714,15 +1716,15 @@
_snackBarController ??= SnackBar.createAnimationController(vsync: this)
..addStatusListener(_handleSnackBarStatusChange);
if (_snackBars.isEmpty) {
- assert(_snackBarController!.isDismissed);
- _snackBarController!.forward();
+ assert(_snackBarController.isDismissed);
+ _snackBarController.forward();
}
- late ScaffoldFeatureController<SnackBar, SnackBarClosedReason> controller;
+ ScaffoldFeatureController<SnackBar, SnackBarClosedReason> controller;
controller = ScaffoldFeatureController<SnackBar, SnackBarClosedReason>._(
// We provide a fallback key so that if back-to-back snackbars happen to
// match in structure, material ink splashes and highlights don't survive
// from one to the next.
- snackbar.withAnimation(_snackBarController!, fallbackKey: UniqueKey()),
+ snackbar.withAnimation(_snackBarController, fallbackKey: UniqueKey()),
Completer<SnackBarClosedReason>(),
() {
assert(_snackBars.first == controller);
@@ -1744,7 +1746,7 @@
_snackBars.removeFirst();
});
if (_snackBars.isNotEmpty)
- _snackBarController!.forward();
+ _snackBarController.forward();
break;
case AnimationStatus.completed:
setState(() {
@@ -1771,7 +1773,7 @@
completer.complete(reason);
_snackBarTimer?.cancel();
_snackBarTimer = null;
- _snackBarController!.value = 0.0;
+ _snackBarController.value = 0.0;
}
/// Removes the current [SnackBar] by running its normal exit animation.
@@ -1779,15 +1781,15 @@
/// The closed completer is called after the animation is complete.
void hideCurrentSnackBar({ SnackBarClosedReason reason = SnackBarClosedReason.hide }) {
assert(reason != null);
- if (_snackBars.isEmpty || _snackBarController!.status == AnimationStatus.dismissed)
+ if (_snackBars.isEmpty || _snackBarController.status == AnimationStatus.dismissed)
return;
- final MediaQueryData mediaQuery = MediaQuery.of(context)!;
+ final MediaQueryData mediaQuery = MediaQuery.of(context);
final Completer<SnackBarClosedReason> completer = _snackBars.first._completer;
if (mediaQuery.accessibleNavigation) {
- _snackBarController!.value = 0.0;
+ _snackBarController.value = 0.0;
completer.complete(reason);
} else {
- _snackBarController!.reverse().then<void>((void value) {
+ _snackBarController.reverse().then<void>((void value) {
assert(mounted);
if (!completer.isCompleted)
completer.complete(reason);
@@ -1804,7 +1806,7 @@
// Important if the app/user takes an action that could repeatedly show a
// bottom sheet.
final List<_StandardBottomSheet> _dismissedBottomSheets = <_StandardBottomSheet>[];
- PersistentBottomSheetController<dynamic>? _currentBottomSheet;
+ PersistentBottomSheetController<dynamic> _currentBottomSheet;
void _maybeBuildPersistentBottomSheet() {
if (widget.bottomSheet != null && _currentBottomSheet == null) {
@@ -1812,7 +1814,7 @@
// will not be added to the Scaffold's appbar and the bottom sheet will not
// support drag or swipe to dismiss.
final AnimationController animationController = BottomSheet.createAnimationController(this)..value = 1.0;
- LocalHistoryEntry? _persistentSheetHistoryEntry;
+ LocalHistoryEntry _persistentSheetHistoryEntry;
bool _persistentBottomSheetExtentChanged(DraggableScrollableNotification notification) {
if (notification.extent > notification.initialExtent) {
if (_persistentSheetHistoryEntry == null) {
@@ -1824,10 +1826,10 @@
_floatingActionButtonVisibilityValue = 1.0;
_persistentSheetHistoryEntry = null;
});
- ModalRoute.of(context)!.addLocalHistoryEntry(_persistentSheetHistoryEntry!);
+ ModalRoute.of(context).addLocalHistoryEntry(_persistentSheetHistoryEntry);
}
} else if (_persistentSheetHistoryEntry != null) {
- ModalRoute.of(context)!.removeLocalHistoryEntry(_persistentSheetHistoryEntry!);
+ ModalRoute.of(context).removeLocalHistoryEntry(_persistentSheetHistoryEntry);
}
return false;
}
@@ -1837,7 +1839,7 @@
return NotificationListener<DraggableScrollableNotification>(
onNotification: _persistentBottomSheetExtentChanged,
child: DraggableScrollableActuator(
- child: widget.bottomSheet!,
+ child: widget.bottomSheet,
),
);
},
@@ -1849,11 +1851,11 @@
void _closeCurrentBottomSheet() {
if (_currentBottomSheet != null) {
- if (!_currentBottomSheet!._isLocalHistoryEntry) {
- _currentBottomSheet!.close();
+ if (!_currentBottomSheet._isLocalHistoryEntry) {
+ _currentBottomSheet.close();
}
assert(() {
- _currentBottomSheet?._completer.future.whenComplete(() {
+ _currentBottomSheet?._completer?.future?.whenComplete(() {
assert(_currentBottomSheet == null);
});
return true;
@@ -1864,11 +1866,11 @@
PersistentBottomSheetController<T> _buildBottomSheet<T>(
WidgetBuilder builder,
bool isPersistent, {
- required AnimationController animationController,
- Color? backgroundColor,
- double? elevation,
- ShapeBorder? shape,
- Clip? clipBehavior,
+ AnimationController animationController,
+ Color backgroundColor,
+ double elevation,
+ ShapeBorder shape,
+ Clip clipBehavior,
}) {
assert(() {
if (widget.bottomSheet != null && isPersistent && _currentBottomSheet != null) {
@@ -1883,7 +1885,7 @@
final Completer<T> completer = Completer<T>();
final GlobalKey<_StandardBottomSheetState> bottomSheetKey = GlobalKey<_StandardBottomSheetState>();
- late _StandardBottomSheet bottomSheet;
+ _StandardBottomSheet bottomSheet;
bool removedEntry = false;
void _removeCurrentBottomSheet() {
@@ -1891,7 +1893,7 @@
if (_currentBottomSheet == null) {
return;
}
- assert(_currentBottomSheet!._widget == bottomSheet);
+ assert(_currentBottomSheet._widget == bottomSheet);
assert(bottomSheetKey.currentState != null);
_showFloatingActionButton();
@@ -1906,7 +1908,7 @@
completer.complete();
}
- final Future<void>? closing = bottomSheetKey.currentState?.close();
+ final Future<void> closing = bottomSheetKey.currentState.close();
if (closing != null) {
closing.then(_closed);
} else {
@@ -1914,7 +1916,7 @@
}
}
- final LocalHistoryEntry? entry = isPersistent
+ final LocalHistoryEntry entry = isPersistent
? null
: LocalHistoryEntry(onRemove: () {
if (!removedEntry) {
@@ -1930,10 +1932,10 @@
if (_currentBottomSheet == null) {
return;
}
- assert(_currentBottomSheet!._widget == bottomSheet);
+ assert(_currentBottomSheet._widget == bottomSheet);
if (!isPersistent && !removedEntry) {
assert(entry != null);
- entry!.remove();
+ entry.remove();
removedEntry = true;
}
},
@@ -1953,7 +1955,7 @@
);
if (!isPersistent)
- ModalRoute.of(context)!.addLocalHistoryEntry(entry!);
+ ModalRoute.of(context).addLocalHistoryEntry(entry);
return PersistentBottomSheetController<T>._(
bottomSheet,
@@ -2043,10 +2045,10 @@
/// * <https://material.io/design/components/sheets-bottom.html#standard-bottom-sheet>
PersistentBottomSheetController<T> showBottomSheet<T>(
WidgetBuilder builder, {
- Color? backgroundColor,
- double? elevation,
- ShapeBorder? shape,
- Clip? clipBehavior,
+ Color backgroundColor,
+ double elevation,
+ ShapeBorder shape,
+ Clip clipBehavior,
}) {
assert(() {
if (widget.bottomSheet != null) {
@@ -2077,12 +2079,12 @@
}
// Floating Action Button API
- late AnimationController _floatingActionButtonMoveController;
- late FloatingActionButtonAnimator _floatingActionButtonAnimator;
- FloatingActionButtonLocation? _previousFloatingActionButtonLocation;
- FloatingActionButtonLocation? _floatingActionButtonLocation;
+ AnimationController _floatingActionButtonMoveController;
+ FloatingActionButtonAnimator _floatingActionButtonAnimator;
+ FloatingActionButtonLocation _previousFloatingActionButtonLocation;
+ FloatingActionButtonLocation _floatingActionButtonLocation;
- late AnimationController _floatingActionButtonVisibilityController;
+ AnimationController _floatingActionButtonVisibilityController;
/// Gets the current value of the visibility animation for the
/// [Scaffold.floatingActionButton].
@@ -2095,7 +2097,7 @@
_floatingActionButtonVisibilityController.value = newValue.clamp(
_floatingActionButtonVisibilityController.lowerBound,
_floatingActionButtonVisibilityController.upperBound,
- );
+ ) as double;
}
/// Shows the [Scaffold.floatingActionButton].
@@ -2105,11 +2107,11 @@
// Moves the Floating Action Button to the new Floating Action Button Location.
void _moveFloatingActionButton(final FloatingActionButtonLocation newLocation) {
- FloatingActionButtonLocation? previousLocation = _floatingActionButtonLocation;
+ FloatingActionButtonLocation previousLocation = _floatingActionButtonLocation;
double restartAnimationFrom = 0.0;
// If the Floating Action Button is moving right now, we need to start from a snapshot of the current transition.
if (_floatingActionButtonMoveController.isAnimating) {
- previousLocation = _TransitionSnapshotFabLocation(_previousFloatingActionButtonLocation!, _floatingActionButtonLocation!, _floatingActionButtonAnimator, _floatingActionButtonMoveController.value);
+ previousLocation = _TransitionSnapshotFabLocation(_previousFloatingActionButtonLocation, _floatingActionButtonLocation, _floatingActionButtonAnimator, _floatingActionButtonMoveController.value);
restartAnimationFrom = _floatingActionButtonAnimator.getAnimationRestart(_floatingActionButtonMoveController.value);
}
@@ -2144,7 +2146,7 @@
// INTERNALS
- _ScaffoldGeometryNotifier? _geometryNotifier;
+ _ScaffoldGeometryNotifier _geometryNotifier;
// Backwards compatibility for deprecated resizeToAvoidBottomPadding property
bool get _resizeToAvoidBottomInset {
@@ -2206,7 +2208,7 @@
@override
void didChangeDependencies() {
- final MediaQueryData mediaQuery = MediaQuery.of(context)!;
+ final MediaQueryData mediaQuery = MediaQuery.of(context);
// If we transition from accessible navigation to non-accessible navigation
// and there is a SnackBar that would have timed out that has already
// completed its timer, dismiss that SnackBar. If the timer hasn't finished
@@ -2214,7 +2216,7 @@
if (_accessibleNavigation == true
&& !mediaQuery.accessibleNavigation
&& _snackBarTimer != null
- && !_snackBarTimer!.isActive) {
+ && !_snackBarTimer.isActive) {
hideCurrentSnackBar(reason: SnackBarClosedReason.timeout);
}
_accessibleNavigation = mediaQuery.accessibleNavigation;
@@ -2227,12 +2229,12 @@
_snackBarController?.dispose();
_snackBarTimer?.cancel();
_snackBarTimer = null;
- _geometryNotifier!.dispose();
+ _geometryNotifier.dispose();
for (final _StandardBottomSheet bottomSheet in _dismissedBottomSheets) {
bottomSheet.animationController?.dispose();
}
if (_currentBottomSheet != null) {
- _currentBottomSheet!._widget.animationController?.dispose();
+ _currentBottomSheet._widget.animationController?.dispose();
}
_floatingActionButtonMoveController.dispose();
_floatingActionButtonVisibilityController.dispose();
@@ -2241,16 +2243,16 @@
void _addIfNonNull(
List<LayoutId> children,
- Widget? child,
+ Widget child,
Object childId, {
- required bool removeLeftPadding,
- required bool removeTopPadding,
- required bool removeRightPadding,
- required bool removeBottomPadding,
+ @required bool removeLeftPadding,
+ @required bool removeTopPadding,
+ @required bool removeRightPadding,
+ @required bool removeBottomPadding,
bool removeBottomInset = false,
bool maintainBottomViewPadding = false,
}) {
- MediaQueryData data = MediaQuery.of(context)!.removePadding(
+ MediaQueryData data = MediaQuery.of(context).removePadding(
removeLeft: removeLeftPadding,
removeTop: removeTopPadding,
removeRight: removeRightPadding,
@@ -2283,7 +2285,7 @@
DrawerController(
key: _endDrawerKey,
alignment: DrawerAlignment.end,
- child: widget.endDrawer!,
+ child: widget.endDrawer,
drawerCallback: _endDrawerOpenedCallback,
dragStartBehavior: widget.drawerDragStartBehavior,
scrimColor: widget.drawerScrimColor,
@@ -2308,7 +2310,7 @@
DrawerController(
key: _drawerKey,
alignment: DrawerAlignment.start,
- child: widget.drawer!,
+ child: widget.drawer,
drawerCallback: _drawerOpenedCallback,
dragStartBehavior: widget.drawerDragStartBehavior,
scrimColor: widget.drawerScrimColor,
@@ -2346,21 +2348,21 @@
Widget build(BuildContext context) {
assert(debugCheckHasMediaQuery(context));
assert(debugCheckHasDirectionality(context));
- final MediaQueryData mediaQuery = MediaQuery.of(context)!;
- final ThemeData themeData = Theme.of(context)!;
- final TextDirection textDirection = Directionality.of(context)!;
+ final MediaQueryData mediaQuery = MediaQuery.of(context);
+ final ThemeData themeData = Theme.of(context);
+ final TextDirection textDirection = Directionality.of(context);
_accessibleNavigation = mediaQuery.accessibleNavigation;
if (_snackBars.isNotEmpty) {
- final ModalRoute<dynamic>? route = ModalRoute.of(context);
+ final ModalRoute<dynamic> route = ModalRoute.of(context);
if (route == null || route.isCurrent) {
- if (_snackBarController!.isCompleted && _snackBarTimer == null) {
+ if (_snackBarController.isCompleted && _snackBarTimer == null) {
final SnackBar snackBar = _snackBars.first._widget;
_snackBarTimer = Timer(snackBar.duration, () {
- assert(_snackBarController!.status == AnimationStatus.forward ||
- _snackBarController!.status == AnimationStatus.completed);
+ assert(_snackBarController.status == AnimationStatus.forward ||
+ _snackBarController.status == AnimationStatus.completed);
// Look up MediaQuery again in case the setting changed.
- final MediaQueryData mediaQuery = MediaQuery.of(context)!;
+ final MediaQueryData mediaQuery = MediaQuery.of(context);
if (mediaQuery.accessibleNavigation && snackBar.action != null)
return;
hideCurrentSnackBar(reason: SnackBarClosedReason.timeout);
@@ -2378,7 +2380,7 @@
widget.body == null ? null : _BodyBuilder(
extendBody: widget.extendBody,
extendBodyBehindAppBar: widget.extendBodyBehindAppBar,
- body: widget.body!,
+ body: widget.body,
),
_ScaffoldSlot.body,
removeLeftPadding: false,
@@ -2404,15 +2406,15 @@
if (widget.appBar != null) {
final double topPadding = widget.primary ? mediaQuery.padding.top : 0.0;
- _appBarMaxHeight = widget.appBar!.preferredSize.height + topPadding;
- assert(_appBarMaxHeight! >= 0.0 && _appBarMaxHeight!.isFinite);
+ _appBarMaxHeight = widget.appBar.preferredSize.height + topPadding;
+ assert(_appBarMaxHeight >= 0.0 && _appBarMaxHeight.isFinite);
_addIfNonNull(
children,
ConstrainedBox(
- constraints: BoxConstraints(maxHeight: _appBarMaxHeight!),
+ constraints: BoxConstraints(maxHeight: _appBarMaxHeight),
child: FlexibleSpaceBar.createSettings(
- currentExtent: _appBarMaxHeight!,
- child: widget.appBar!,
+ currentExtent: _appBarMaxHeight,
+ child: widget.appBar,
),
),
_ScaffoldSlot.appBar,
@@ -2424,7 +2426,7 @@
}
bool isSnackBarFloating = false;
- double? snackBarWidth;
+ double snackBarWidth;
if (_snackBars.isNotEmpty) {
final SnackBarBehavior snackBarBehavior = _snackBars.first._widget.behavior
?? themeData.snackBarTheme.behavior
@@ -2456,7 +2458,7 @@
child: SafeArea(
top: false,
child: ButtonBar(
- children: widget.persistentFooterButtons!,
+ children: widget.persistentFooterButtons,
),
),
),
@@ -2487,7 +2489,7 @@
alignment: Alignment.bottomCenter,
children: <Widget>[
..._dismissedBottomSheets,
- if (_currentBottomSheet != null) _currentBottomSheet!._widget,
+ if (_currentBottomSheet != null) _currentBottomSheet._widget,
],
);
_addIfNonNull(
@@ -2507,7 +2509,7 @@
child: widget.floatingActionButton,
fabMoveAnimation: _floatingActionButtonMoveController,
fabMotionAnimator: _floatingActionButtonAnimator,
- geometryNotifier: _geometryNotifier!,
+ geometryNotifier: _geometryNotifier,
currentController: _floatingActionButtonVisibilityController,
),
_ScaffoldSlot.floatingActionButton,
@@ -2571,7 +2573,7 @@
controller: _primaryScrollController,
child: Material(
color: widget.backgroundColor ?? themeData.scaffoldBackgroundColor,
- child: AnimatedBuilder(animation: _floatingActionButtonMoveController, builder: (BuildContext context, Widget? child) {
+ child: AnimatedBuilder(animation: _floatingActionButtonMoveController, builder: (BuildContext context, Widget child) {
return CustomMultiChildLayout(
children: children,
delegate: _ScaffoldLayout(
@@ -2579,11 +2581,11 @@
extendBodyBehindAppBar: widget.extendBodyBehindAppBar,
minInsets: minInsets,
minViewPadding: minViewPadding,
- currentFloatingActionButtonLocation: _floatingActionButtonLocation!,
+ currentFloatingActionButtonLocation: _floatingActionButtonLocation,
floatingActionButtonMoveAnimationProgress: _floatingActionButtonMoveController.value,
floatingActionButtonMotionAnimator: _floatingActionButtonAnimator,
- geometryNotifier: _geometryNotifier!,
- previousFloatingActionButtonLocation: _previousFloatingActionButtonLocation!,
+ geometryNotifier: _geometryNotifier,
+ previousFloatingActionButtonLocation: _previousFloatingActionButtonLocation,
textDirection: textDirection,
isSnackBarFloating: isSnackBarFloating,
snackBarWidth: snackBarWidth,
@@ -2611,7 +2613,7 @@
final VoidCallback close;
/// Mark the feature (e.g., bottom sheet or snack bar) as needing to rebuild.
- final StateSetter? setState;
+ final StateSetter setState;
}
// TODO(guidezpl): Look into making this public. A copy of this class is in
@@ -2663,7 +2665,7 @@
final double curveProgress = (t - startingPoint) / (1 - startingPoint);
final double transformed = curve.transform(curveProgress);
- return lerpDouble(startingPoint, 1, transformed)!;
+ return lerpDouble(startingPoint, 1, transformed);
}
@override
@@ -2674,12 +2676,12 @@
class _StandardBottomSheet extends StatefulWidget {
const _StandardBottomSheet({
- Key? key,
- required this.animationController,
+ Key key,
+ this.animationController,
this.enableDrag = true,
- required this.onClosing,
- required this.onDismissed,
- required this.builder,
+ this.onClosing,
+ this.onDismissed,
+ this.builder,
this.isPersistent = false,
this.backgroundColor,
this.elevation,
@@ -2687,16 +2689,16 @@
this.clipBehavior,
}) : super(key: key);
- final AnimationController? animationController; // we control it, but it must be disposed by whoever created it.
+ final AnimationController animationController; // we control it, but it must be disposed by whoever created it.
final bool enableDrag;
- final VoidCallback? onClosing;
- final VoidCallback? onDismissed;
+ final VoidCallback onClosing;
+ final VoidCallback onDismissed;
final WidgetBuilder builder;
final bool isPersistent;
- final Color? backgroundColor;
- final double? elevation;
- final ShapeBorder? shape;
- final Clip? clipBehavior;
+ final Color backgroundColor;
+ final double elevation;
+ final ShapeBorder shape;
+ final Clip clipBehavior;
@override
_StandardBottomSheetState createState() => _StandardBottomSheetState();
@@ -2709,9 +2711,9 @@
void initState() {
super.initState();
assert(widget.animationController != null);
- assert(widget.animationController!.status == AnimationStatus.forward
- || widget.animationController!.status == AnimationStatus.completed);
- widget.animationController!.addStatusListener(_handleStatusChange);
+ assert(widget.animationController.status == AnimationStatus.forward
+ || widget.animationController.status == AnimationStatus.completed);
+ widget.animationController.addStatusListener(_handleStatusChange);
}
@override
@@ -2720,10 +2722,13 @@
assert(widget.animationController == oldWidget.animationController);
}
- Future<void> close() async {
+ Future<void> close() {
assert(widget.animationController != null);
- widget.animationController!.reverse();
- widget.onClosing?.call();
+ widget.animationController.reverse();
+ if (widget.onClosing != null) {
+ widget.onClosing();
+ }
+ return null;
}
void _handleDragStart(DragStartDetails details) {
@@ -2731,23 +2736,23 @@
animationCurve = Curves.linear;
}
- void _handleDragEnd(DragEndDetails details, { bool? isClosing }) {
+ void _handleDragEnd(DragEndDetails details, { bool isClosing }) {
// Allow the bottom sheet to animate smoothly from its current position.
animationCurve = _BottomSheetSuspendedCurve(
- widget.animationController!.value,
+ widget.animationController.value,
curve: _standardBottomSheetCurve,
);
}
void _handleStatusChange(AnimationStatus status) {
- if (status == AnimationStatus.dismissed) {
- widget.onDismissed?.call();
+ if (status == AnimationStatus.dismissed && widget.onDismissed != null) {
+ widget.onDismissed();
}
}
bool extentChanged(DraggableScrollableNotification notification) {
final double extentRemaining = 1.0 - notification.extent;
- final ScaffoldState scaffold = Scaffold.of(context)!;
+ final ScaffoldState scaffold = Scaffold.of(context);
if (extentRemaining < _kBottomSheetDominatesPercentage) {
scaffold._floatingActionButtonVisibilityValue = extentRemaining * _kBottomSheetDominatesPercentage * 10;
scaffold.showBodyScrim(true, math.max(
@@ -2780,11 +2785,11 @@
Widget build(BuildContext context) {
if (widget.animationController != null) {
return AnimatedBuilder(
- animation: widget.animationController!,
- builder: (BuildContext context, Widget? child) {
+ animation: widget.animationController,
+ builder: (BuildContext context, Widget child) {
return Align(
alignment: AlignmentDirectional.topStart,
- heightFactor: animationCurve.transform(widget.animationController!.value),
+ heightFactor: animationCurve.transform(widget.animationController.value),
child: child,
);
},
@@ -2794,7 +2799,7 @@
enableDrag: widget.enableDrag,
onDragStart: _handleDragStart,
onDragEnd: _handleDragEnd,
- onClosing: widget.onClosing!,
+ onClosing: widget.onClosing,
builder: widget.builder,
backgroundColor: widget.backgroundColor,
elevation: widget.elevation,
@@ -2807,7 +2812,7 @@
return _wrapBottomSheet(
BottomSheet(
- onClosing: widget.onClosing!,
+ onClosing: widget.onClosing,
builder: widget.builder,
backgroundColor: widget.backgroundColor,
),
@@ -2837,15 +2842,15 @@
class _ScaffoldScope extends InheritedWidget {
const _ScaffoldScope({
- Key? key,
- required this.hasDrawer,
- required this.geometryNotifier,
- required Widget child,
+ Key key,
+ @required this.hasDrawer,
+ @required this.geometryNotifier,
+ @required Widget child,
}) : assert(hasDrawer != null),
super(key: key, child: child);
final bool hasDrawer;
- final _ScaffoldGeometryNotifier? geometryNotifier;
+ final _ScaffoldGeometryNotifier geometryNotifier;
@override
bool updateShouldNotify(_ScaffoldScope oldWidget) {
diff --git a/packages/flutter/test/material/bottom_navigation_bar_theme_test.dart b/packages/flutter/test/material/bottom_navigation_bar_theme_test.dart
index c2fe4b4..66ebdd5 100644
--- a/packages/flutter/test/material/bottom_navigation_bar_theme_test.dart
+++ b/packages/flutter/test/material/bottom_navigation_bar_theme_test.dart
@@ -30,7 +30,7 @@
expect(themeData.showUnselectedLabels, null);
expect(themeData.type, null);
- const BottomNavigationBarTheme theme = BottomNavigationBarTheme(data: BottomNavigationBarThemeData(), child: SizedBox());
+ const BottomNavigationBarTheme theme = BottomNavigationBarTheme(data: BottomNavigationBarThemeData());
expect(theme.data.backgroundColor, null);
expect(theme.data.elevation, null);
expect(theme.data.selectedIconTheme, null);