diff --git a/lib/data/models/schedule_model.dart b/lib/data/models/schedule_model.dart index 2379cc246..589f67c03 100644 --- a/lib/data/models/schedule_model.dart +++ b/lib/data/models/schedule_model.dart @@ -130,7 +130,8 @@ abstract class ScheduleEntity extends Object return actions..addAll(super.getActions(userCompany: userCompany)); } - int compareTo(ScheduleEntity? schedule, String sortField, bool sortAscending) { + int compareTo( + ScheduleEntity? schedule, String sortField, bool sortAscending) { int response = 0; final scheduleA = sortAscending ? this : schedule; final scheduleB = sortAscending ? schedule : this; @@ -174,9 +175,9 @@ abstract class ScheduleEntity extends Object } @override - String? get listDisplayName { + String get listDisplayName { final localization = AppLocalization.of(navigatorKey.currentContext!)!; - return localization.lookup(template); + return localization.lookup(template) ?? ''; } @override @@ -204,7 +205,7 @@ abstract class ScheduleParameters showPaymentsTable: action == ScheduleEntity.TEMPLATE_EMAIL_STATEMENT ? true : null, onlyClientsWithInvoices: - action == ScheduleEntity.TEMPLATE_EMAIL_STATEMENT ? false : null, + action == ScheduleEntity.TEMPLATE_EMAIL_STATEMENT ? false : null, showCreditsTable: action == ScheduleEntity.TEMPLATE_EMAIL_STATEMENT ? true : null, status: action == ScheduleEntity.TEMPLATE_EMAIL_STATEMENT diff --git a/lib/data/models/transaction_model.dart b/lib/data/models/transaction_model.dart index 6c0538f1b..66c590466 100644 --- a/lib/data/models/transaction_model.dart +++ b/lib/data/models/transaction_model.dart @@ -363,11 +363,12 @@ abstract class TransactionEntity extends Object } @override - String? get listDisplayName { + String get listDisplayName { if (description.isNotEmpty) { return description.split('\n').first; } else { - return AppLocalization.of(navigatorKey.currentContext!)!.transaction; + return AppLocalization.of(navigatorKey.currentContext!)!.transaction ?? + ''; } } diff --git a/lib/ui/app/app_bottom_bar.dart b/lib/ui/app/app_bottom_bar.dart index 7b06e8696..5d02728e1 100644 --- a/lib/ui/app/app_bottom_bar.dart +++ b/lib/ui/app/app_bottom_bar.dart @@ -49,7 +49,7 @@ class AppBottomBar extends StatefulWidget { final List sortFields; final List statuses; final Function onCheckboxPressed; - final Function(String?)? onSelectedSortField; + final Function(String)? onSelectedSortField; final Function(EntityState, bool?)? onSelectedState; final Function(EntityStatus, bool?)? onSelectedStatus; final Function(String)? onSelectedCustom1; @@ -258,7 +258,7 @@ class _AppBottomBarState extends State { listUIState.sortField == field) { // Is re-selecting widget.onSelectedSortField!(field); - } else { + } else if (value != null) { widget.onSelectedSortField!(value); } }, diff --git a/lib/ui/app/entity_dropdown.dart b/lib/ui/app/entity_dropdown.dart index fe9f0e2d0..579d48f80 100644 --- a/lib/ui/app/entity_dropdown.dart +++ b/lib/ui/app/entity_dropdown.dart @@ -393,7 +393,7 @@ class _EntityDropdownState extends State { : kDefaultLightSelectedColor) : Theme.of(context).cardColor, child: EntityAutocompleteListTile( - onTap: (entity) => onSelected(entity), + onTap: (entity) => onSelected(entity!), entity: options.elementAt(index), filter: _filter, overrideSuggestedAmount: @@ -550,7 +550,7 @@ class _EntityDropdownDialogState extends State { itemCount: matches.length, itemBuilder: (BuildContext context, int index) { final entityId = matches[index]; - final entity = widget.entityMap![entityId]; + final entity = widget.entityMap![entityId]!; return EntityAutocompleteListTile( entity: entity, filter: _filter, @@ -586,12 +586,12 @@ class EntityAutocompleteListTile extends StatelessWidget { this.onTap, this.subtitle}); - final SelectableEntity? entity; - final Function(SelectableEntity? entity)? onTap; + final SelectableEntity entity; + final Function(SelectableEntity entity)? onTap; final String? filter; final String? subtitle; - final Function(SelectableEntity?)? overrideSuggestedAmount; - final Function(SelectableEntity?)? overrideSuggestedLabel; + final Function(SelectableEntity)? overrideSuggestedAmount; + final Function(SelectableEntity)? overrideSuggestedLabel; @override Widget build(BuildContext context) { diff --git a/lib/ui/app/forms/client_picker.dart b/lib/ui/app/forms/client_picker.dart index 2e9566af5..17ddb46ef 100644 --- a/lib/ui/app/forms/client_picker.dart +++ b/lib/ui/app/forms/client_picker.dart @@ -29,7 +29,7 @@ class ClientPicker extends StatelessWidget { final String? clientId; final ClientState clientState; - final Function(SelectableEntity) onSelected; + final Function(SelectableEntity?) onSelected; final Function(Completer completer)? onAddPressed; final bool? autofocus; final List excludeIds; diff --git a/lib/ui/app/forms/custom_field.dart b/lib/ui/app/forms/custom_field.dart index a49e5fb8b..4154ec54a 100644 --- a/lib/ui/app/forms/custom_field.dart +++ b/lib/ui/app/forms/custom_field.dart @@ -93,10 +93,12 @@ class _CustomFieldState extends State { case kFieldTypeSwitch: return BoolDropdownButton( onChanged: (value) { - _controller!.text = value ? kSwitchValueYes : kSwitchValueNo; + _controller!.text = + value == true ? kSwitchValueYes : kSwitchValueNo; Debouncer.complete(); if (widget.onChanged != null) { - widget.onChanged!(value ? kSwitchValueYes : kSwitchValueNo); + widget + .onChanged!(value == true ? kSwitchValueYes : kSwitchValueNo); } }, value: widget.value == null ? null : widget.value == kSwitchValueYes, diff --git a/lib/ui/app/forms/date_picker.dart b/lib/ui/app/forms/date_picker.dart index 692bdffe6..151154c96 100644 --- a/lib/ui/app/forms/date_picker.dart +++ b/lib/ui/app/forms/date_picker.dart @@ -117,7 +117,7 @@ class _DatePickerState extends State { @override Widget build(BuildContext context) { - var label = widget.labelText; + var label = widget.labelText ?? ''; if (widget.message != null && (widget.selectedDate ?? '').isEmpty) { label += ' • ${widget.message}'; } @@ -130,7 +130,7 @@ class _DatePickerState extends State { keyboardType: TextInputType.text, decoration: InputDecoration( hintText: widget.hint ?? '', - labelText: _pendingValue ?? label ?? '', + labelText: _pendingValue ?? label, suffixIcon: widget.allowClearing && (widget.selectedDate ?? '').isNotEmpty ? IconButton( diff --git a/lib/ui/app/forms/dynamic_selector.dart b/lib/ui/app/forms/dynamic_selector.dart index d8f65f7f6..9398b96c3 100644 --- a/lib/ui/app/forms/dynamic_selector.dart +++ b/lib/ui/app/forms/dynamic_selector.dart @@ -67,7 +67,7 @@ class DynamicSelector extends StatelessWidget { return EntityDropdown( labelText: labelText ?? localization!.lookup('$entityType'), entityType: entityType, - onSelected: (entity) => onChanged!(entity?.id), + onSelected: (entity) => onChanged!(entity?.id ?? ''), onAddPressed: onAddPressed, entityId: entityId, entityList: entityIds, diff --git a/lib/ui/app/forms/vendor_picker.dart b/lib/ui/app/forms/vendor_picker.dart index 2a651ed88..e31d2436c 100644 --- a/lib/ui/app/forms/vendor_picker.dart +++ b/lib/ui/app/forms/vendor_picker.dart @@ -28,7 +28,7 @@ class VendorPicker extends StatelessWidget { final String vendorId; final VendorState vendorState; - final Function(SelectableEntity) onSelected; + final Function(SelectableEntity?) onSelected; final Function(Completer completer) onAddPressed; final bool? autofocus; diff --git a/lib/ui/app/menu_drawer_vm.dart b/lib/ui/app/menu_drawer_vm.dart index a8b2a0f70..58f246c7c 100644 --- a/lib/ui/app/menu_drawer_vm.dart +++ b/lib/ui/app/menu_drawer_vm.dart @@ -1,4 +1,6 @@ // Flutter imports: +import 'dart:async'; + import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -138,7 +140,7 @@ class MenuDrawerVM { final completer = snackBarCompleter( context, AppLocalization.of(context)!.addedCompany, shouldPop: true) - ..future.then((value) { + ..future.then(() { AppBuilder.of(navigatorKey.currentContext!)!.rebuild(); } as FutureOr Function(Null)); diff --git a/lib/ui/app/tables/app_paginated_data_table.dart b/lib/ui/app/tables/app_paginated_data_table.dart index 25325b404..4333f7d36 100644 --- a/lib/ui/app/tables/app_paginated_data_table.dart +++ b/lib/ui/app/tables/app_paginated_data_table.dart @@ -141,7 +141,7 @@ class AppPaginatedDataTable extends StatefulWidget { /// checkbox in the heading row. /// /// See [DataTable.onSelectAll]. - final ValueSetter? onSelectAll; + final ValueSetter? onSelectAll; /// The height of each row (excluding the row that contains column headings). /// diff --git a/lib/ui/app/tables/entity_list.dart b/lib/ui/app/tables/entity_list.dart index aded81db4..49b19df96 100644 --- a/lib/ui/app/tables/entity_list.dart +++ b/lib/ui/app/tables/entity_list.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'dart:math'; // Flutter imports: +import 'package:built_collection/built_collection.dart'; import 'package:collection/collection.dart' show IterableNullableExtension; import 'package:flutter/material.dart' hide DataRow, DataCell, DataColumn; @@ -116,7 +117,8 @@ class _EntityListState extends State { final uiState = state.getUIState(widget.entityType)!; dataTableSource.editingId = uiState.editingId; dataTableSource.entityList = widget.entityList; - dataTableSource.entityMap = state.getEntityMap(widget.entityType) as BuiltMap?; + dataTableSource.entityMap = state.getEntityMap(widget.entityType) + as BuiltMap?; // ignore: invalid_use_of_visible_for_testing_member, invalid_use_of_protected_member dataTableSource.notifyListeners(); @@ -254,8 +256,8 @@ class _EntityListState extends State { min(_firstRowIndex + rowsPerPage, entityList.length); final entities = entityList .sublist(startIndex, endIndex) - .map( - (String? entityId) => entityMap![entityId] as BaseEntity?) + .map((String? entityId) => + entityMap![entityId] as BaseEntity?) .where((invoice) => value != listUIState.isSelected(invoice!.id)) .toList(); @@ -285,16 +287,18 @@ class _EntityListState extends State { }), ], source: dataTableSource, - sortColumnIndex: - widget.tableColumns!.contains(listUIState.sortField) - ? widget.tableColumns!.indexOf(listUIState.sortField) - : 0, + sortColumnIndex: widget.tableColumns! + .contains(listUIState.sortField) + ? widget.tableColumns!.indexOf(listUIState.sortField) + : 0, sortAscending: listUIState.sortAscending, rowsPerPage: state.prefState.rowsPerPage, onPageChanged: (row) { - _firstRowIndex = row; - store.dispatch(UpdateLastHistory( - (row / state.prefState.rowsPerPage).floor())); + if (row != null) { + _firstRowIndex = row; + store.dispatch(UpdateLastHistory( + (row / state.prefState.rowsPerPage).floor())); + } }, initialFirstRowIndex: _firstRowIndex, availableRowsPerPage: [ @@ -358,8 +362,8 @@ class _EntityListState extends State { min(entityList.length, kMaxEntitiesPerBulkAction); final entities = entityList .sublist(0, endIndex) - .map( - (entityId) => entityMap![entityId] as BaseEntity?) + .map((entityId) => + entityMap![entityId] as BaseEntity?) .toList(); handleEntitiesActions( entities, EntityAction.toggleMultiselect); @@ -466,8 +470,9 @@ class _EntityListState extends State { entities: entities, multiselect: true, completer: Completer() - ..future.then( - ((_) => widget.onClearMultiselect()) as FutureOr Function(Null)), + ..future.then((() => + widget.onClearMultiselect()) + as FutureOr Function(Null)), ); }, onCancelPressed: (_) => widget.onClearMultiselect(), diff --git a/lib/ui/auth/login_view.dart b/lib/ui/auth/login_view.dart index c3b5a0a22..445164769 100644 --- a/lib/ui/auth/login_view.dart +++ b/lib/ui/auth/login_view.dart @@ -185,11 +185,11 @@ class _LoginState extends State { final Completer completer = Completer(); completer.future - .then((_) { + .then(() { setState(() { _loginError = ''; }); - } as FutureOr<_> Function(Null)) + } as FutureOr Function(Null)) .catchError((Object error) { setState(() { _buttonController.reset(); diff --git a/lib/ui/auth/login_vm.dart b/lib/ui/auth/login_vm.dart index 62a0dac90..658799d37 100644 --- a/lib/ui/auth/login_vm.dart +++ b/lib/ui/auth/login_vm.dart @@ -115,10 +115,8 @@ class LoginVM { onMicrosoftSignUpPressed; final Function(BuildContext, Completer completer, - {String url, - String? secret, - String? oneTimePassword}) onAppleLoginPressed; - final Function(BuildContext, Completer completer, String? url) + {String url, String secret, String oneTimePassword}) onAppleLoginPressed; + final Function(BuildContext, Completer completer, String url) onAppleSignUpPressed; static LoginVM fromStore(Store store) { @@ -164,9 +162,9 @@ class LoginVM { onGoogleLoginPressed: ( BuildContext context, Completer completer, { - required String url, - required String secret, - required String oneTimePassword, + String url = '', + String secret = '', + String oneTimePassword = '', }) async { try { await GoogleOAuth.signOut(); @@ -286,9 +284,9 @@ class LoginVM { onAppleLoginPressed: ( BuildContext context, Completer completer, { - required String url, - required String secret, - required String oneTimePassword, + String url = '', + String secret = '', + String oneTimePassword = '', }) async { try { final credentials = await SignInWithApple.getAppleIDCredential( diff --git a/lib/ui/company_gateway/company_gateway_screen.dart b/lib/ui/company_gateway/company_gateway_screen.dart index b8e85da5a..179623fae 100644 --- a/lib/ui/company_gateway/company_gateway_screen.dart +++ b/lib/ui/company_gateway/company_gateway_screen.dart @@ -72,8 +72,9 @@ class CompanyGatewayScreen extends StatelessWidget { entities: companyGateways, multiselect: true, completer: Completer() - ..future.then(((_) => - store.dispatch(ClearCompanyGatewayMultiselect())) as FutureOr Function(Null)), + ..future.then((() => store + .dispatch(ClearCompanyGatewayMultiselect())) + as FutureOr Function(Null)), ); }, onCancelPressed: (context) => diff --git a/lib/ui/invoice/edit/invoice_edit_details_vm.dart b/lib/ui/invoice/edit/invoice_edit_details_vm.dart index 5d50ba50e..f98352190 100644 --- a/lib/ui/invoice/edit/invoice_edit_details_vm.dart +++ b/lib/ui/invoice/edit/invoice_edit_details_vm.dart @@ -68,7 +68,7 @@ class EntityEditDetailsVM { final Function(InvoiceEntity)? onChanged; final Function(BuildContext context, InvoiceEntity, ClientEntity?)? onClientChanged; - final Function(BuildContext context, InvoiceEntity, VendorEntity)? + final Function(BuildContext context, InvoiceEntity, VendorEntity?)? onVendorChanged; final BuiltMap? clientMap; final BuiltList? clientList; diff --git a/lib/ui/invoice/edit/invoice_edit_items_vm.dart b/lib/ui/invoice/edit/invoice_edit_items_vm.dart index 8f7fb5011..994f913c6 100644 --- a/lib/ui/invoice/edit/invoice_edit_items_vm.dart +++ b/lib/ui/invoice/edit/invoice_edit_items_vm.dart @@ -67,7 +67,7 @@ class EntityEditItemsVM { final int? invoiceItemIndex; final Function? addLineItem; final Function? deleteLineItem; - final Function(int?)? onRemoveInvoiceItemPressed; + final Function(int)? onRemoveInvoiceItemPressed; final Function? clearSelectedInvoiceItem; final Function(InvoiceItemEntity, int?)? onChangedInvoiceItem; final Function(int, int)? onMovedInvoiceItem; diff --git a/lib/ui/settings/localization_vm.dart b/lib/ui/settings/localization_vm.dart index 5fdca2a92..4dc35ac91 100644 --- a/lib/ui/settings/localization_vm.dart +++ b/lib/ui/settings/localization_vm.dart @@ -75,14 +75,14 @@ class LocalizationSettingsVM { final appBuilder = AppBuilder.of(context); final completer = snackBarCompleter( context, AppLocalization.of(context)!.savedSettings) - ..future.then((value) { + ..future.then(() { appBuilder!.rebuild(); store.dispatch(RefreshData( includeStatic: true, completer: Completer() ..future .then((dynamic value) => appBuilder.rebuild()))); - } as FutureOr Function(Null)); + } as FutureOr Function(Null)); store.dispatch(SaveCompanyRequest( completer: completer, company: settingsUIState.company)); break; diff --git a/lib/ui/task_status/task_status_screen.dart b/lib/ui/task_status/task_status_screen.dart index 205a333c5..463a05981 100644 --- a/lib/ui/task_status/task_status_screen.dart +++ b/lib/ui/task_status/task_status_screen.dart @@ -78,8 +78,9 @@ class TaskStatusScreen extends StatelessWidget { entities: taskStatusIds, multiselect: true, completer: Completer() - ..future.then( - ((_) => store.dispatch(ClearTaskStatusMultiselect())) as FutureOr Function(Null)), + ..future.then((() => + store.dispatch(ClearTaskStatusMultiselect())) + as FutureOr Function(Null)), ); }, label: localization!.actions,