From 66c320cfd4a4772f00ca99d6a51ad46fe2c89a8a Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Sun, 1 Oct 2023 11:04:17 +0300 Subject: [PATCH] Null safety --- lib/ui/app/forms/custom_field.dart | 2 +- lib/ui/app/forms/date_picker.dart | 2 +- lib/ui/app/forms/learn_more.dart | 2 +- lib/ui/app/invoice/invoice_email_view.dart | 2 +- lib/ui/app/lists/activity_list_tile.dart | 2 +- lib/ui/app/multiselect.dart | 2 +- lib/ui/app/presenters/entity_presenter.dart | 2 +- .../app/tables/app_paginated_data_table.dart | 5 +- .../recurring_invoice_list_item.dart | 58 +++++++++---------- .../recurring_invoice_list_vm.dart | 2 +- 10 files changed, 39 insertions(+), 40 deletions(-) diff --git a/lib/ui/app/forms/custom_field.dart b/lib/ui/app/forms/custom_field.dart index 529dd1eae..b18674895 100644 --- a/lib/ui/app/forms/custom_field.dart +++ b/lib/ui/app/forms/custom_field.dart @@ -64,7 +64,7 @@ class _CustomFieldState extends State { final localization = AppLocalization.of(context); final fieldLabel = company.getCustomFieldLabel(widget.field); - if ((fieldLabel).isEmpty) { + if (fieldLabel.isEmpty) { return SizedBox(); } diff --git a/lib/ui/app/forms/date_picker.dart b/lib/ui/app/forms/date_picker.dart index 2dc96d60a..da0930e22 100644 --- a/lib/ui/app/forms/date_picker.dart +++ b/lib/ui/app/forms/date_picker.dart @@ -265,7 +265,7 @@ class _DatePickerState extends State { } } - if ((date).isNotEmpty) { + if (date.isNotEmpty) { widget.onSelected(date, true); } diff --git a/lib/ui/app/forms/learn_more.dart b/lib/ui/app/forms/learn_more.dart index 72b506b91..3a5246662 100644 --- a/lib/ui/app/forms/learn_more.dart +++ b/lib/ui/app/forms/learn_more.dart @@ -22,7 +22,7 @@ class LearnMoreUrl extends StatelessWidget { Widget build(BuildContext context) { final localization = AppLocalization.of(context); - if ((url).isEmpty) { + if (url.isEmpty) { return child; } diff --git a/lib/ui/app/invoice/invoice_email_view.dart b/lib/ui/app/invoice/invoice_email_view.dart index 4a55d10af..2ced65e5f 100644 --- a/lib/ui/app/invoice/invoice_email_view.dart +++ b/lib/ui/app/invoice/invoice_email_view.dart @@ -87,7 +87,7 @@ class _InvoiceEmailViewState extends State selectedTemplate = EmailTemplate.reminder3; else if ((invoice.reminder1Sent ?? '').isNotEmpty) selectedTemplate = EmailTemplate.reminder2; - else if ((invoice.lastSentDate ?? '').isNotEmpty) + else if ((invoice.lastSentDate).isNotEmpty) selectedTemplate = EmailTemplate.reminder1; else selectedTemplate = EmailTemplate.invoice; diff --git a/lib/ui/app/lists/activity_list_tile.dart b/lib/ui/app/lists/activity_list_tile.dart index a2ae7dfb7..91ac3c24c 100644 --- a/lib/ui/app/lists/activity_list_tile.dart +++ b/lib/ui/app/lists/activity_list_tile.dart @@ -139,7 +139,7 @@ class ActivityListTile extends StatelessWidget { subtitle: Row( children: [ Flexible( - child: Text(((activity.notes ?? '').isNotEmpty + child: Text(((activity.notes).isNotEmpty ? localization.lookup(activity.notes)!.trim() + '\n' : '') + formatDate( diff --git a/lib/ui/app/multiselect.dart b/lib/ui/app/multiselect.dart index 66d0b51b8..6c607fc6b 100644 --- a/lib/ui/app/multiselect.dart +++ b/lib/ui/app/multiselect.dart @@ -174,7 +174,7 @@ class _DropDownMultiSelectState extends State { ? widget.selectedValues .map((dynamic e) => e.toString()) .reduce((a, b) => a + ' , ' + b) - : widget.whenEmpty ?? ''), + : widget.whenEmpty), ), alignment: Alignment.centerLeft), ), diff --git a/lib/ui/app/presenters/entity_presenter.dart b/lib/ui/app/presenters/entity_presenter.dart index 2cb1ac59a..9dcb05f48 100644 --- a/lib/ui/app/presenters/entity_presenter.dart +++ b/lib/ui/app/presenters/entity_presenter.dart @@ -31,7 +31,7 @@ class EntityPresenter { var name = entity.listDisplayName; // TODO replace with this: https://github.com/flutter/flutter/issues/45336 - if ((name ?? '').isEmpty) { + if ((name).isEmpty) { name = localization.pending; } diff --git a/lib/ui/app/tables/app_paginated_data_table.dart b/lib/ui/app/tables/app_paginated_data_table.dart index c2c8d8591..3d4e2c7b9 100644 --- a/lib/ui/app/tables/app_paginated_data_table.dart +++ b/lib/ui/app/tables/app_paginated_data_table.dart @@ -227,8 +227,7 @@ class AppPaginatedDataTableState extends State { super.initState(); _controller = ScrollController(); _firstRowIndex = PageStorage.of(context).readState(context) as int? ?? - widget.initialFirstRowIndex ?? - 0; + widget.initialFirstRowIndex; widget.source.addListener(_handleDataSourceChanged); _handleDataSourceChanged(); } @@ -298,7 +297,7 @@ class AppPaginatedDataTableState extends State { if (index < _rowCount || _rowCountApproximate) { row = _rows.putIfAbsent(index, () => widget.source.getRow(index)); if (row == null && !haveProgressIndicator) { - row ??= _getProgressIndicatorRowFor(index); + row = _getProgressIndicatorRowFor(index); haveProgressIndicator = true; } } diff --git a/lib/ui/recurring_invoice/recurring_invoice_list_item.dart b/lib/ui/recurring_invoice/recurring_invoice_list_item.dart index ae9d352fa..e254cae2d 100644 --- a/lib/ui/recurring_invoice/recurring_invoice_list_item.dart +++ b/lib/ui/recurring_invoice/recurring_invoice_list_item.dart @@ -25,7 +25,7 @@ class RecurringInvoiceListItem extends StatelessWidget { this.showCheckbox = true, }); - final InvoiceEntity? invoice; + final InvoiceEntity invoice; final String? filter; final bool showCheckbox; @@ -33,38 +33,38 @@ class RecurringInvoiceListItem extends StatelessWidget { Widget build(BuildContext context) { final store = StoreProvider.of(context); final state = store.state; - final client = state.clientState.get(invoice!.clientId); + final client = state.clientState.get(invoice.clientId); final uiState = state.uiState; final invoiceUIState = uiState.recurringInvoiceUIState; - final listUIState = state.getUIState(invoice!.entityType)!.listUIState; + final listUIState = state.getUIState(invoice.entityType)!.listUIState; final isInMultiselect = showCheckbox && listUIState.isInMultiselect(); - final isChecked = isInMultiselect && listUIState.isSelected(invoice!.id); + final isChecked = isInMultiselect && listUIState.isSelected(invoice.id); final textStyle = TextStyle(fontSize: 16); final localization = AppLocalization.of(context)!; final filterMatch = filter != null && filter!.isNotEmpty - ? (invoice!.matchesFilterValue(filter) ?? + ? (invoice.matchesFilterValue(filter) ?? client!.matchesFilterValue(filter)) : null; final statusLabel = localization - .lookup(kRecurringInvoiceStatuses[invoice!.calculatedStatusId]); + .lookup(kRecurringInvoiceStatuses[invoice.calculatedStatusId]); final statusColor = RecurringInvoiceStatusColors(state.prefState.colorThemeModel) - .colors[invoice!.calculatedStatusId]; + .colors[invoice.calculatedStatusId]; final textColor = Theme.of(context).textTheme.bodyLarge!.color; String subtitle = ''; - if (invoice!.nextSendDate.isNotEmpty) { - subtitle += formatDate(invoice!.nextSendDate, context); + if (invoice.nextSendDate.isNotEmpty) { + subtitle += formatDate(invoice.nextSendDate, context); } if (subtitle.isNotEmpty) { subtitle += ' • '; } - subtitle += localization.lookup(kFrequencies[invoice!.frequencyId])!; + subtitle += localization.lookup(kFrequencies[invoice.frequencyId])!; return DismissibleEntity( isSelected: isDesktop(context) && - invoice!.id == + invoice.id == (uiState.isEditing ? invoiceUIState.editing!.id : invoiceUIState.selectedId), @@ -76,11 +76,11 @@ class RecurringInvoiceListItem extends StatelessWidget { return constraints.maxWidth > kTableListWidthCutoff ? InkWell( onTap: () => selectEntity( - entity: invoice!, + entity: invoice, forceView: !showCheckbox, ), onLongPress: () => - selectEntity(entity: invoice!, longPress: true), + selectEntity(entity: invoice, longPress: true), child: Padding( padding: const EdgeInsets.only( left: 10, @@ -106,7 +106,7 @@ class RecurringInvoiceListItem extends StatelessWidget { ), ) : ActionMenuButton( - entityActions: invoice!.getActions( + entityActions: invoice.getActions( userCompany: state.userCompany, client: client, includeEdit: true, @@ -122,13 +122,13 @@ class RecurringInvoiceListItem extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - (invoice!.number ?? '').isEmpty + (invoice.number).isEmpty ? localization.pending - : invoice!.number, + : invoice.number, style: textStyle, overflow: TextOverflow.ellipsis, ), - if (!invoice!.isActive) EntityStateLabel(invoice) + if (!invoice.isActive) EntityStateLabel(invoice) ], ), ), @@ -139,7 +139,7 @@ class RecurringInvoiceListItem extends StatelessWidget { children: [ Text( client!.displayName + - (invoice!.documents.isNotEmpty + (invoice.documents.isNotEmpty ? ' 📎' : ''), style: textStyle), @@ -160,7 +160,7 @@ class RecurringInvoiceListItem extends StatelessWidget { ), SizedBox(width: 10), Text( - formatNumber(invoice!.amount, context, + formatNumber(invoice.amount, context, clientId: client.id)!, style: textStyle, textAlign: TextAlign.end, @@ -173,9 +173,9 @@ class RecurringInvoiceListItem extends StatelessWidget { ) : ListTile( onTap: () => - selectEntity(entity: invoice!, forceView: !showCheckbox), + selectEntity(entity: invoice, forceView: !showCheckbox), onLongPress: () => - selectEntity(entity: invoice!, longPress: true), + selectEntity(entity: invoice, longPress: true), leading: isInMultiselect ? IgnorePointer( ignoring: listUIState.isInMultiselect(), @@ -202,8 +202,8 @@ class RecurringInvoiceListItem extends StatelessWidget { ), SizedBox(width: 4), Text( - formatNumber(invoice!.amount, context, - clientId: invoice!.clientId)!, + formatNumber(invoice.amount, context, + clientId: invoice.clientId)!, style: Theme.of(context).textTheme.titleMedium), ], ), @@ -216,15 +216,15 @@ class RecurringInvoiceListItem extends StatelessWidget { Expanded( child: filterMatch == null ? Text( - (((invoice!.number ?? '').isEmpty + (((invoice.number ?? '').isEmpty ? localization.pending - : invoice!.number) + - (invoice!.nextSendDate.isNotEmpty + : invoice.number) + + (invoice.nextSendDate.isNotEmpty ? ' • ' : '') + - formatDate(invoice!.nextSendDate, + formatDate(invoice.nextSendDate, context) + - (invoice!.documents.isNotEmpty + (invoice.documents.isNotEmpty ? ' 📎' : '')) .trim(), @@ -238,7 +238,7 @@ class RecurringInvoiceListItem extends StatelessWidget { Text(statusLabel!, style: TextStyle( color: - !invoice!.isSent ? textColor : statusColor, + !invoice.isSent ? textColor : statusColor, )), ], ), diff --git a/lib/ui/recurring_invoice/recurring_invoice_list_vm.dart b/lib/ui/recurring_invoice/recurring_invoice_list_vm.dart index e12a11e3a..15011bdf6 100644 --- a/lib/ui/recurring_invoice/recurring_invoice_list_vm.dart +++ b/lib/ui/recurring_invoice/recurring_invoice_list_vm.dart @@ -43,7 +43,7 @@ class RecurringInvoiceListBuilder extends StatelessWidget { itemBuilder: (BuildContext context, index) { final recurringInvoiceId = viewModel.recurringInvoiceList[index]; final recurringInvoice = - viewModel.recurringInvoiceMap[recurringInvoiceId]; + viewModel.recurringInvoiceMap[recurringInvoiceId]!; return RecurringInvoiceListItem( filter: viewModel.filter,