diff --git a/platform_design/analysis_options.yaml b/platform_design/analysis_options.yaml new file mode 100644 index 000000000..f117e8a5f --- /dev/null +++ b/platform_design/analysis_options.yaml @@ -0,0 +1,30 @@ +include: package:pedantic/analysis_options.yaml + +analyzer: + strong-mode: + implicit-casts: false + implicit-dynamic: false + +linter: + rules: + - avoid_types_on_closure_parameters + - avoid_void_async + - await_only_futures + - camel_case_types + - cancel_subscriptions + - close_sinks + - constant_identifier_names + - control_flow_in_finally + - empty_statements + - hash_and_equals + - implementation_imports + - non_constant_identifier_names + - package_api_docs + - package_names + - package_prefixed_library_names + - test_types_in_equals + - throw_in_finally + - unnecessary_brace_in_string_interps + - unnecessary_getters_setters + - unnecessary_new + - unnecessary_statements diff --git a/platform_design/lib/main.dart b/platform_design/lib/main.dart index e58e9d331..41a1aee43 100644 --- a/platform_design/lib/main.dart +++ b/platform_design/lib/main.dart @@ -62,7 +62,7 @@ class _PlatformAdaptingHomePageState extends State { // In Material, this app uses the hamburger menu paradigm and flatly lists // all 4 possible tabs. This drawer is injected into the songs tab which is // actually building the scaffold around the drawer. - Widget _buildAndroidHomePage(context) { + Widget _buildAndroidHomePage(BuildContext context) { return SongsTab( key: songsTabKey, androidDrawer: _AndroidDrawer(), @@ -77,7 +77,7 @@ class _PlatformAdaptingHomePageState extends State { // large number of items, a tab bar cannot. To illustrate one way of adjusting // for this, the app folds its fourth tab (the settings page) into the // third tab. This is a common pattern on iOS. - Widget _buildIosHomePage(context) { + Widget _buildIosHomePage(BuildContext context) { return CupertinoTabScaffold( tabBar: CupertinoTabBar( items: [ @@ -153,7 +153,7 @@ class _AndroidDrawer extends StatelessWidget { title: Text(NewsTab.title), onTap: () { Navigator.pop(context); - Navigator.push( + Navigator.push( context, MaterialPageRoute(builder: (context) => NewsTab())); }, ), @@ -162,7 +162,7 @@ class _AndroidDrawer extends StatelessWidget { title: Text(ProfileTab.title), onTap: () { Navigator.pop(context); - Navigator.push(context, + Navigator.push(context, MaterialPageRoute(builder: (context) => ProfileTab())); }, ), @@ -176,7 +176,7 @@ class _AndroidDrawer extends StatelessWidget { title: Text(SettingsTab.title), onTap: () { Navigator.pop(context); - Navigator.push(context, + Navigator.push(context, MaterialPageRoute(builder: (context) => SettingsTab())); }, ), diff --git a/platform_design/lib/news_tab.dart b/platform_design/lib/news_tab.dart index 31bc1e269..4e8614137 100644 --- a/platform_design/lib/news_tab.dart +++ b/platform_design/lib/news_tab.dart @@ -31,7 +31,7 @@ class _NewsTabState extends State { super.initState(); } - Widget _listBuilder(context, index) { + Widget _listBuilder(BuildContext context, int index) { if (index >= _itemsLength) return null; return SafeArea( @@ -90,7 +90,7 @@ class _NewsTabState extends State { // Non-shared code below because this tab uses different scaffolds. // =========================================================================== - Widget _buildAndroid(context) { + Widget _buildAndroid(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(NewsTab.title), @@ -104,7 +104,7 @@ class _NewsTabState extends State { ); } - Widget _buildIos(context) { + Widget _buildIos(BuildContext context) { return CupertinoPageScaffold( navigationBar: CupertinoNavigationBar(), child: Container( diff --git a/platform_design/lib/profile_tab.dart b/platform_design/lib/profile_tab.dart index fb4e413c9..4c78c93ff 100644 --- a/platform_design/lib/profile_tab.dart +++ b/platform_design/lib/profile_tab.dart @@ -9,7 +9,7 @@ class ProfileTab extends StatelessWidget { static const androidIcon = Icon(Icons.person); static const iosIcon = Icon(CupertinoIcons.profile_circled); - Widget _buildBody(context) { + Widget _buildBody(BuildContext context) { return SafeArea( child: Padding( padding: const EdgeInsets.all(24.0), @@ -63,7 +63,7 @@ class ProfileTab extends StatelessWidget { // the profile tab as a button in the nav bar. // =========================================================================== - Widget _buildAndroid(context) { + Widget _buildAndroid(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(title), @@ -72,7 +72,7 @@ class ProfileTab extends StatelessWidget { ); } - Widget _buildIos(context) { + Widget _buildIos(BuildContext context) { return CupertinoPageScaffold( navigationBar: CupertinoNavigationBar( trailing: CupertinoButton( @@ -81,7 +81,7 @@ class ProfileTab extends StatelessWidget { onPressed: () { // This pushes the settings page as a full page modal dialog on top // of the tab bar and everything. - Navigator.of(context, rootNavigator: true).push( + Navigator.of(context, rootNavigator: true).push( CupertinoPageRoute( title: SettingsTab.title, fullscreenDialog: true, @@ -172,13 +172,13 @@ class LogOutButton extends StatelessWidget { // app. // =========================================================================== - Widget _buildAndroid(context) { + Widget _buildAndroid(BuildContext context) { return RaisedButton( child: Text('LOG OUT', style: TextStyle(color: Colors.red)), onPressed: () { // You should do something with the result of the dialog prompt in a // real app but this is just a demo. - showDialog( + showDialog( context: context, builder: (context) { return AlertDialog( @@ -201,14 +201,14 @@ class LogOutButton extends StatelessWidget { ); } - Widget _buildIos(context) { + Widget _buildIos(BuildContext context) { return CupertinoButton( color: CupertinoColors.destructiveRed, child: Text('Log out'), onPressed: () { // You should do something with the result of the action sheet prompt // in a real app but this is just a demo. - showCupertinoModalPopup( + showCupertinoModalPopup( context: context, builder: (context) { return CupertinoActionSheet( diff --git a/platform_design/lib/settings_tab.dart b/platform_design/lib/settings_tab.dart index ff2a3d1ee..fde9b9efc 100644 --- a/platform_design/lib/settings_tab.dart +++ b/platform_design/lib/settings_tab.dart @@ -83,7 +83,7 @@ class _SettingsTabState extends State { // Non-shared code below because this tab uses different scaffolds. // =========================================================================== - Widget _buildAndroid(context) { + Widget _buildAndroid(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(SettingsTab.title), @@ -92,7 +92,7 @@ class _SettingsTabState extends State { ); } - Widget _buildIos(context) { + Widget _buildIos(BuildContext context) { return CupertinoPageScaffold( navigationBar: CupertinoNavigationBar(), child: _buildList(), diff --git a/platform_design/lib/song_detail_tab.dart b/platform_design/lib/song_detail_tab.dart index 21eadd977..91b8d1ba4 100644 --- a/platform_design/lib/song_detail_tab.dart +++ b/platform_design/lib/song_detail_tab.dart @@ -77,14 +77,14 @@ class SongDetailTab extends StatelessWidget { // Non-shared code below because we're using different scaffolds. // =========================================================================== - Widget _buildAndroid(context) { + Widget _buildAndroid(BuildContext context) { return Scaffold( appBar: AppBar(title: Text(song)), body: _buildBody(), ); } - Widget _buildIos(context) { + Widget _buildIos(BuildContext context) { return CupertinoPageScaffold( navigationBar: CupertinoNavigationBar( middle: Text(song), diff --git a/platform_design/lib/songs_tab.dart b/platform_design/lib/songs_tab.dart index 413d56705..b472639e9 100644 --- a/platform_design/lib/songs_tab.dart +++ b/platform_design/lib/songs_tab.dart @@ -46,7 +46,7 @@ class _SongsTabState extends State { ); } - Widget _listBuilder(context, index) { + Widget _listBuilder(BuildContext context, int index) { if (index >= _itemsLength) return null; // Show a slightly different color palette. Show poppy-ier colors on iOS @@ -64,7 +64,7 @@ class _SongsTabState extends State { song: songNames[index], color: color, heroAnimation: AlwaysStoppedAnimation(0), - onPressed: () => Navigator.of(context).push( + onPressed: () => Navigator.of(context).push( MaterialPageRoute( builder: (context) => SongDetailTab( id: index, @@ -106,7 +106,7 @@ class _SongsTabState extends State { // And these are all design time choices that doesn't have a single 'right' // answer. // =========================================================================== - Widget _buildAndroid(context) { + Widget _buildAndroid(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(SongsTab.title), @@ -133,7 +133,7 @@ class _SongsTabState extends State { ); } - Widget _buildIos(context) { + Widget _buildIos(BuildContext context) { return CustomScrollView( slivers: [ CupertinoSliverNavigationBar( diff --git a/platform_design/lib/utils.dart b/platform_design/lib/utils.dart index fa1012ae1..0ef9716d6 100644 --- a/platform_design/lib/utils.dart +++ b/platform_design/lib/utils.dart @@ -26,9 +26,9 @@ const _myListOfRandomColors = [ final _random = Random(); -Iterable wordPairIterator = generateWordPair(); +final wordPairIterator = generateWordPair(); Iterable generateWordPair() sync* { - bool filterWord(word) => unsafe.contains(word); + bool filterWord(String word) => unsafe.contains(word); String pickRandom(List list) => list[_random.nextInt(list.length)]; String prefix; @@ -50,7 +50,7 @@ Iterable generateWordPair() sync* { String generateRandomHeadline() { final artist = capitalizePair(wordPairIterator.first); - switch (_random.nextInt(9)) { + switch (_random.nextInt(10)) { case 0: return '$artist says ${nouns[_random.nextInt(nouns.length)]}'; case 1: @@ -67,9 +67,9 @@ String generateRandomHeadline() { return '$artist says their music is inspired by ${wordPairIterator.first.join(' ')}'; case 7: return '$artist says the world needs more ${nouns[_random.nextInt(nouns.length)]}'; - case 7: - return '$artist calls their band ${adjectives[_random.nextInt(adjectives.length)]}'; case 8: + return '$artist calls their band ${adjectives[_random.nextInt(adjectives.length)]}'; + case 9: return '$artist finally ready to talk about ${nouns[_random.nextInt(nouns.length)]}'; } @@ -78,7 +78,7 @@ String generateRandomHeadline() { } List getRandomColors(int amount) { - return List.generate(amount, (int index) { + return List.generate(amount, (index) { return _myListOfRandomColors[_random.nextInt(_myListOfRandomColors.length)]; }); } diff --git a/platform_design/lib/widgets.dart b/platform_design/lib/widgets.dart index 5fe2a78a0..6c8b813ac 100644 --- a/platform_design/lib/widgets.dart +++ b/platform_design/lib/widgets.dart @@ -47,7 +47,7 @@ class PressableCard extends StatefulWidget { final Widget child; @override - State createState() => new _PressableCardState(); + State createState() => _PressableCardState(); } class _PressableCardState extends State @@ -280,7 +280,7 @@ class SongPlaceholderTile extends StatelessWidget { void showChoices(BuildContext context, List choices) { switch (defaultTargetPlatform) { case TargetPlatform.android: - showDialog( + showDialog( context: context, builder: (context) { int selectedRadio = 1; @@ -295,7 +295,8 @@ void showChoices(BuildContext context, List choices) { title: Text(choices[index]), value: index, groupValue: selectedRadio, - onChanged: (value) { + // ignore: avoid_types_on_closure_parameters + onChanged: (int value) { setState(() => selectedRadio = value); }, ); @@ -318,7 +319,7 @@ void showChoices(BuildContext context, List choices) { ); return; case TargetPlatform.iOS: - showCupertinoModalPopup( + showCupertinoModalPopup( context: context, builder: (context) { return SizedBox( diff --git a/platform_design/pubspec.lock b/platform_design/pubspec.lock index 150d185a4..7650cd5e8 100644 --- a/platform_design/pubspec.lock +++ b/platform_design/pubspec.lock @@ -82,7 +82,7 @@ packages: source: hosted version: "1.6.2" pedantic: - dependency: transitive + dependency: "direct dev" description: name: pedantic url: "https://pub.dartlang.org" @@ -157,5 +157,5 @@ packages: source: hosted version: "2.0.8" sdks: - dart: ">=2.2.0 <3.0.0" + dart: ">=2.3.0-dev <3.0.0" flutter: ">=1.5.2" diff --git a/platform_design/pubspec.yaml b/platform_design/pubspec.yaml index 4bde7cf8d..12d8b9bce 100644 --- a/platform_design/pubspec.yaml +++ b/platform_design/pubspec.yaml @@ -3,7 +3,7 @@ description: A project showcasing a Flutter app following different platform IA version: 1.0.0+1 environment: - sdk: ">=2.1.0 <3.0.0" + sdk: ">=2.3.0-dev <3.0.0" flutter: ">=1.5.2" dependencies: @@ -17,6 +17,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter + pedantic: ^1.5.0 flutter: uses-material-design: true