diff --git a/analysis_options.yaml b/analysis_options.yaml index cc50fe2..e2f34ae 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -5,6 +5,7 @@ linter: public_member_api_docs: false prefer_expression_function_bodies: true prefer_single_quotes: true + prefer_final_locals: true analyzer: exclude: - - '**/*.g.dart' + - "**/*.g.dart" diff --git a/lib/comment_tree.dart b/lib/comment_tree.dart index f8d6630..671b7e9 100644 --- a/lib/comment_tree.dart +++ b/lib/comment_tree.dart @@ -21,7 +21,7 @@ class CommentTree { static List fromList(List comments) { CommentTree gatherChildren(CommentTree parent) { - for (var el in comments) { + for (final el in comments) { if (el.parentId == parent.comment.id) { parent.children.add(gatherChildren(CommentTree(el))); } @@ -29,7 +29,7 @@ class CommentTree { return parent; } - var parents = []; + final parents = []; // first pass to get all the parents for (var i = 0; i < comments.length; i++) { @@ -38,7 +38,7 @@ class CommentTree { } } - var result = parents.map(gatherChildren).toList(); + final result = parents.map(gatherChildren).toList(); return result; } @@ -63,7 +63,7 @@ class CommentTree { void _sort(int compare(CommentTree a, CommentTree b)) { children.sort(compare); - for (var el in children) { + for (final el in children) { el._sort(compare); } } diff --git a/lib/hooks/delayed_loading.dart b/lib/hooks/delayed_loading.dart index 9280e21..781ad61 100644 --- a/lib/hooks/delayed_loading.dart +++ b/lib/hooks/delayed_loading.dart @@ -23,9 +23,9 @@ class DelayedLoading { /// and loading is triggered after [delayDuration]. /// Everything can be reset with [.cancel()] DelayedLoading useDelayedLoading(Duration delayDuration) { - var loading = useState(false); - var pending = useState(false); - var timerHandle = useRef(null); + final loading = useState(false); + final pending = useState(false); + final timerHandle = useRef(null); return DelayedLoading( loading: loading.value, diff --git a/lib/main.dart b/lib/main.dart index 87382d7..cae0097 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -11,10 +11,10 @@ import 'stores/config_store.dart'; Future main() async { WidgetsFlutterBinding.ensureInitialized(); - var configStore = ConfigStore(); + final configStore = ConfigStore(); await configStore.load(); - var accountsStore = AccountsStore(); + final accountsStore = AccountsStore(); await accountsStore.load(); runApp( diff --git a/lib/pages/communities_tab.dart b/lib/pages/communities_tab.dart index 0712a28..cdecf3b 100644 --- a/lib/pages/communities_tab.dart +++ b/lib/pages/communities_tab.dart @@ -16,21 +16,21 @@ class CommunitiesTab extends HookWidget { @override Widget build(BuildContext context) { - var theme = Theme.of(context); - var filterController = useTextEditingController(); + final theme = Theme.of(context); + final filterController = useTextEditingController(); useValueListenable(filterController); final accountsStore = useAccountsStore(); - var amountOfDisplayInstances = useMemoized(() { + final amountOfDisplayInstances = useMemoized(() { return accountsStore.users.keys .where((e) => !accountsStore.isAnonymousFor(e)) .length; }); - var isCollapsed = useState(List.filled(amountOfDisplayInstances, false)); + final isCollapsed = useState(List.filled(amountOfDisplayInstances, false)); // TODO: use useMemoFuture - var instancesFut = useMemoized(() { - var futures = accountsStore.users.keys + final instancesFut = useMemoized(() { + final futures = accountsStore.users.keys .where((e) => !accountsStore.isAnonymousFor(e)) .map( (instanceUrl) => @@ -40,8 +40,8 @@ class CommunitiesTab extends HookWidget { return Future.wait(futures); }); - var communitiesFut = useMemoized(() { - var futures = accountsStore.users.keys + final communitiesFut = useMemoized(() { + final futures = accountsStore.users.keys .where((e) => !accountsStore.isAnonymousFor(e)) .map( (instanceUrl) => LemmyApi(instanceUrl) @@ -58,8 +58,8 @@ class CommunitiesTab extends HookWidget { return Future.wait(futures); }); - var communitiesSnap = useFuture(communitiesFut); - var instancesSnap = useFuture(instancesFut); + final communitiesSnap = useFuture(communitiesFut); + final instancesSnap = useFuture(instancesFut); if (communitiesSnap.hasError || instancesSnap.hasError) { return Scaffold( @@ -88,12 +88,12 @@ class CommunitiesTab extends HookWidget { ); } - var instances = instancesSnap.data; - var communities = communitiesSnap.data + final instances = instancesSnap.data; + final communities = communitiesSnap.data ..forEach( (e) => e.sort((a, b) => a.communityName.compareTo(b.communityName))); - var filterIcon = () { + final filterIcon = () { if (filterController.text.isEmpty) { return Icon(Icons.filter_list); } @@ -108,7 +108,7 @@ class CommunitiesTab extends HookWidget { }(); filterCommunities(List comm) { - var matches = Fuzzy( + final matches = Fuzzy( comm.map((e) => e.communityName).toList(), options: FuzzyOptions(threshold: 0.5), ).search(filterController.text).map((e) => e.item); @@ -141,7 +141,7 @@ class CommunitiesTab extends HookWidget { ), body: ListView( children: [ - for (var i in Iterable.generate(amountOfDisplayInstances)) + for (final i in Iterable.generate(amountOfDisplayInstances)) Column( children: [ ListTile( @@ -173,7 +173,7 @@ class CommunitiesTab extends HookWidget { ), ), if (!isCollapsed.value[i]) - for (var comm in filterCommunities(communities[i])) + for (final comm in filterCommunities(communities[i])) Padding( padding: const EdgeInsets.only(left: 17), child: ListTile( @@ -231,9 +231,9 @@ class _CommunitySubscribeToggle extends HookWidget { @override Widget build(BuildContext context) { - var theme = Theme.of(context); - var subbed = useState(true); - var delayed = useDelayedLoading(const Duration(milliseconds: 500)); + final theme = Theme.of(context); + final subbed = useState(true); + final delayed = useDelayedLoading(const Duration(milliseconds: 500)); final accountsStore = useAccountsStore(); handleTap() async { diff --git a/lib/pages/community.dart b/lib/pages/community.dart index 0b3d660..2824650 100644 --- a/lib/pages/community.dart +++ b/lib/pages/community.dart @@ -50,7 +50,7 @@ class CommunityPage extends HookWidget { final theme = Theme.of(context); final accountsStore = useAccountsStore(); - var fullCommunitySnap = useMemoFuture(() { + final fullCommunitySnap = useMemoFuture(() { final token = accountsStore.defaultTokenFor(instanceUrl); if (communityId != null) { @@ -552,7 +552,7 @@ class _FollowButton extends HookWidget { } isPending.value = true; - var spinnerTimer = + final spinnerTimer = Timer(Duration(milliseconds: 500), () => showSpinner.value = true); final api = LemmyApi(community.instanceUrl).v1; diff --git a/lib/pages/profile_tab.dart b/lib/pages/profile_tab.dart index 21af767..e238189 100644 --- a/lib/pages/profile_tab.dart +++ b/lib/pages/profile_tab.dart @@ -15,7 +15,7 @@ class UserProfileTab extends HookWidget { @override Widget build(BuildContext context) { - var theme = Theme.of(context); + final theme = Theme.of(context); final accountsStore = useAccountsStore(); return Observer( @@ -40,7 +40,7 @@ class UserProfileTab extends HookWidget { ); } - var user = accountsStore.defaultUser; + final user = accountsStore.defaultUser; return Scaffold( extendBodyBehindAppBar: true, @@ -69,7 +69,7 @@ class UserProfileTab extends HookWidget { context: context, backgroundColor: Colors.transparent, builder: (_) { - var userTags = []; + final userTags = []; accountsStore.users.forEach((instanceUrl, value) { value.forEach((username, _) { @@ -79,8 +79,8 @@ class UserProfileTab extends HookWidget { return Observer( builder: (ctx) { - var user = accountsStore.defaultUser; - var instanceUrl = user.instanceUrl; + final user = accountsStore.defaultUser; + final instanceUrl = user.instanceUrl; return BottomModal( title: 'account', @@ -92,7 +92,7 @@ class UserProfileTab extends HookWidget { title: Text(tag), groupValue: '${user.name}@$instanceUrl', onChanged: (selected) { - var userTag = selected.split('@'); + final userTag = selected.split('@'); accountsStore.setDefaultAccount( userTag[1], userTag[0]); Navigator.of(ctx).pop(); diff --git a/lib/pages/settings.dart b/lib/pages/settings.dart index a25386b..d94164b 100644 --- a/lib/pages/settings.dart +++ b/lib/pages/settings.dart @@ -2,14 +2,14 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; -import 'package:lemmur/hooks/stores.dart'; +import '../hooks/stores.dart'; import '../util/goto.dart'; class SettingsPage extends StatelessWidget { @override Widget build(BuildContext context) { - var theme = Theme.of(context); + final theme = Theme.of(context); return Scaffold( appBar: AppBar( @@ -46,7 +46,7 @@ class SettingsPage extends StatelessWidget { class AppearanceConfigPage extends StatelessWidget { @override Widget build(BuildContext context) { - var theme = Theme.of(context); + final theme = Theme.of(context); final configStore = useConfigStore(); return Scaffold( @@ -88,7 +88,7 @@ class AccountsConfigPage extends HookWidget { @override Widget build(BuildContext context) { - var theme = Theme.of(context); + final theme = Theme.of(context); final accountsStore = useAccountsStore(); return Scaffold( @@ -112,13 +112,13 @@ class AccountsConfigPage extends HookWidget { ), body: Observer( builder: (ctx) { - var theme = Theme.of(context); + final theme = Theme.of(context); return ListView( children: [ - for (var entry in accountsStore.users.entries) ...[ + for (final entry in accountsStore.users.entries) ...[ _SectionHeading(entry.key), - for (var username in entry.value.keys) ...[ + for (final username in entry.value.keys) ...[ ListTile( trailing: username == accountsStore.defaultUserFor(entry.key).name @@ -165,11 +165,11 @@ class _AccountsConfigAddInstanceDialog extends HookWidget { @override Widget build(BuildContext context) { - var instanceController = useTextEditingController(); + final instanceController = useTextEditingController(); useValueListenable(instanceController); final accountsStore = useAccountsStore(); - var loading = useState(false); + final loading = useState(false); handleOnAdd() async { try { @@ -220,13 +220,13 @@ class _AccountsConfigAddAccountDialog extends HookWidget { @override Widget build(BuildContext context) { - var usernameController = useTextEditingController(); - var passwordController = useTextEditingController(); + final usernameController = useTextEditingController(); + final passwordController = useTextEditingController(); useValueListenable(usernameController); useValueListenable(passwordController); final accountsStore = useAccountsStore(); - var loading = useState(false); + final loading = useState(false); handleOnAdd() async { try { diff --git a/lib/pages/user.dart b/lib/pages/user.dart index ef3a3cd..270c4d3 100644 --- a/lib/pages/user.dart +++ b/lib/pages/user.dart @@ -30,9 +30,9 @@ class UserPage extends HookWidget { @override Widget build(BuildContext context) { - var userViewSnap = useFuture(_userView); + final userViewSnap = useFuture(_userView); - var body = () { + final body = () { if (userViewSnap.hasData) { return UserProfile.fromUserView(userViewSnap.data); } else if (userViewSnap.hasError) { diff --git a/lib/stores/accounts_store.dart b/lib/stores/accounts_store.dart index 601f569..998cc35 100644 --- a/lib/stores/accounts_store.dart +++ b/lib/stores/accounts_store.dart @@ -32,7 +32,7 @@ abstract class _AccountsStore with Store { } void load() async { - var prefs = await SharedPreferences.getInstance(); + final prefs = await SharedPreferences.getInstance(); nestedMapsCast(String key, T f(Map json)) => ObservableMap.of( @@ -59,7 +59,7 @@ abstract class _AccountsStore with Store { } void save() async { - var prefs = await SharedPreferences.getInstance(); + final prefs = await SharedPreferences.getInstance(); await prefs.setString('defaultAccount', _defaultAccount); await prefs.setString('defaultAccounts', jsonEncode(_defaultAccounts)); @@ -93,7 +93,7 @@ abstract class _AccountsStore with Store { return null; } - var userTag = _defaultAccount.split('@'); + final userTag = _defaultAccount.split('@'); return users[userTag[1]][userTag[0]]; } @@ -103,7 +103,7 @@ abstract class _AccountsStore with Store { return null; } - var userTag = _defaultAccount.split('@'); + final userTag = _defaultAccount.split('@'); return tokens[userTag[1]][userTag[0]]; } @@ -159,13 +159,13 @@ abstract class _AccountsStore with Store { throw Exception('No such instance was added'); } - var lemmy = LemmyApi(instanceUrl).v1; + final lemmy = LemmyApi(instanceUrl).v1; - var token = await lemmy.login( + final token = await lemmy.login( usernameOrEmail: usernameOrEmail, password: password, ); - var userData = + final userData = await lemmy.getSite(auth: token.raw).then((value) => value.myUser); // first account for this instance diff --git a/lib/stores/config_store.dart b/lib/stores/config_store.dart index 9aafcd4..bb6b34a 100644 --- a/lib/stores/config_store.dart +++ b/lib/stores/config_store.dart @@ -22,14 +22,14 @@ abstract class _ConfigStore with Store { } void load() async { - var prefs = await SharedPreferences.getInstance(); + final prefs = await SharedPreferences.getInstance(); // load saved settings or create defaults theme = _themeModeFromString(prefs.getString('theme') ?? 'system'); amoledDarkMode = prefs.getBool('amoledDarkMode') ?? false; } void save() async { - var prefs = await SharedPreferences.getInstance(); + final prefs = await SharedPreferences.getInstance(); await prefs.setString('theme', describeEnum(theme)); await prefs.setBool('amoledDarkMode', amoledDarkMode); diff --git a/lib/widgets/badge.dart b/lib/widgets/badge.dart index fffe847..3b9b027 100644 --- a/lib/widgets/badge.dart +++ b/lib/widgets/badge.dart @@ -11,7 +11,7 @@ class Badge extends StatelessWidget { @override Widget build(BuildContext context) { - var theme = Theme.of(context); + final theme = Theme.of(context); return Container( height: 25, diff --git a/lib/widgets/bottom_modal.dart b/lib/widgets/bottom_modal.dart index c9abb75..50f13d2 100644 --- a/lib/widgets/bottom_modal.dart +++ b/lib/widgets/bottom_modal.dart @@ -8,7 +8,7 @@ class BottomModal extends StatelessWidget { @override Widget build(BuildContext context) { - var theme = Theme.of(context); + final theme = Theme.of(context); return SafeArea( child: Padding( diff --git a/lib/widgets/comment.dart b/lib/widgets/comment.dart index 9d71bb8..559be00 100644 --- a/lib/widgets/comment.dart +++ b/lib/widgets/comment.dart @@ -314,7 +314,7 @@ class Comment extends HookWidget { : BorderSide.none, top: BorderSide(width: 0.2))), ), - for (var c in commentTree.children) + for (final c in commentTree.children) Comment( c, indent: indent + 1, diff --git a/lib/widgets/comment_section.dart b/lib/widgets/comment_section.dart index 95b19ba..297db74 100644 --- a/lib/widgets/comment_section.dart +++ b/lib/widgets/comment_section.dart @@ -34,9 +34,9 @@ class CommentSection extends HookWidget { @override Widget build(BuildContext context) { - var sorting = useState(sortType); - var rawComms = useState(rawComments); - var comms = useState(comments); + final sorting = useState(sortType); + final rawComms = useState(rawComments); + final comms = useState(comments); void sortComments(CommentSortType sort) { if (sort != sorting.value && sort != CommentSortType.chat) { @@ -106,7 +106,8 @@ class CommentSection extends HookWidget { postCreatorId: postCreatorId, ) else - for (var com in comms.value) Comment(com, postCreatorId: postCreatorId), + for (final com in comms.value) + Comment(com, postCreatorId: postCreatorId), ]); } } diff --git a/lib/widgets/post.dart b/lib/widgets/post.dart index 4f201e2..1fb4c75 100644 --- a/lib/widgets/post.dart +++ b/lib/widgets/post.dart @@ -151,7 +151,7 @@ class Post extends StatelessWidget { final urlDomain = () { if (post.url == null) return null; - var url = post.url.split('/')[2]; + final url = post.url.split('/')[2]; if (url.startsWith('www.')) return url.substring(4); return url; }(); diff --git a/lib/widgets/post_list_options.dart b/lib/widgets/post_list_options.dart index 4975c09..11f4a29 100644 --- a/lib/widgets/post_list_options.dart +++ b/lib/widgets/post_list_options.dart @@ -16,7 +16,7 @@ class PostListOptions extends HookWidget { @override Widget build(BuildContext context) { - var sort = useState(defaultSort); + final sort = useState(defaultSort); void selectSortType(BuildContext context) { showModalBottomSheet( @@ -27,7 +27,7 @@ class PostListOptions extends HookWidget { title: 'sort by', child: Column( children: [ - for (var x in SortType.values) + for (final x in SortType.values) RadioListTile( value: x, groupValue: sort.value, diff --git a/lib/widgets/user_profile.dart b/lib/widgets/user_profile.dart index f5afc3a..905fe89 100644 --- a/lib/widgets/user_profile.dart +++ b/lib/widgets/user_profile.dart @@ -29,11 +29,11 @@ class UserProfile extends HookWidget { @override Widget build(BuildContext context) { - var theme = Theme.of(context); + final theme = Theme.of(context); final colorOnTopOfAccentColor = textColorBasedOnBackground(theme.accentColor); - var userViewSnap = useFuture(_userView, preserveState: false); + final userViewSnap = useFuture(_userView, preserveState: false); Widget bio = () { if (userViewSnap.hasData) {