activate prefer_final_locals lint rule
This commit is contained in:
parent
c6b03c3aef
commit
0540be3ede
|
@ -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"
|
||||
|
|
|
@ -21,7 +21,7 @@ class CommentTree {
|
|||
|
||||
static List<CommentTree> fromList(List<CommentView> 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 = <CommentTree>[];
|
||||
final parents = <CommentTree>[];
|
||||
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<Timer>(null);
|
||||
final loading = useState(false);
|
||||
final pending = useState(false);
|
||||
final timerHandle = useRef<Timer>(null);
|
||||
|
||||
return DelayedLoading(
|
||||
loading: loading.value,
|
||||
|
|
|
@ -11,10 +11,10 @@ import 'stores/config_store.dart';
|
|||
Future<void> main() async {
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
var configStore = ConfigStore();
|
||||
final configStore = ConfigStore();
|
||||
await configStore.load();
|
||||
|
||||
var accountsStore = AccountsStore();
|
||||
final accountsStore = AccountsStore();
|
||||
await accountsStore.load();
|
||||
|
||||
runApp(
|
||||
|
|
|
@ -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<CommunityFollowerView> 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 {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 = <String>[];
|
||||
final userTags = <String>[];
|
||||
|
||||
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();
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -32,7 +32,7 @@ abstract class _AccountsStore with Store {
|
|||
}
|
||||
|
||||
void load() async {
|
||||
var prefs = await SharedPreferences.getInstance();
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
|
||||
nestedMapsCast<T>(String key, T f(Map<String, dynamic> 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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}();
|
||||
|
|
|
@ -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<SortType>(
|
||||
value: x,
|
||||
groupValue: sort.value,
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue