Null safety

This commit is contained in:
Hillel Coren 2023-09-18 23:34:25 +03:00
parent 63e3efc406
commit 3b3dd7c91d
25 changed files with 100 additions and 78 deletions

View File

@ -135,7 +135,8 @@ class _HistoryListTileState extends State<HistoryListTile> {
} else if (history.id == null) {
title = Text(localization!.lookup(history.entityType.plural)!);
} else {
entity = state.getEntityMap(history.entityType)![history.id] as BaseEntity?;
entity =
state.getEntityMap(history.entityType)![history.id] as BaseEntity?;
if (entity == null) {
return SizedBox();
@ -260,9 +261,9 @@ class _HistoryListTileState extends State<HistoryListTile> {
entities: [entity],
completer: state.prefState.isHistoryFloated
? (Completer<Null>()
..future.then((value) {
..future.then<Null>(() {
Navigator.pop(context);
} as FutureOr<_> Function(Null)))
} as FutureOr<Null> Function(Null)))
: null,
);
},

View File

@ -24,7 +24,7 @@ class IconMessage extends StatelessWidget {
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 16, horizontal: 20),
child: Row(
children: <Widget?>[
children: <Widget>[
Icon(
iconData ?? Icons.info_outline,
size: 18.0,
@ -53,7 +53,7 @@ class IconMessage extends StatelessWidget {
),
if (trailing != null) ...[
SizedBox(width: 16),
trailing,
trailing!,
]
],
),

View File

@ -258,8 +258,8 @@ class _MenuDrawerState extends State<MenuDrawer> {
} else if (companyId == 'company') {
widget.viewModel.onAddCompany(context);
} else {
final company =
state.companies.firstWhere((company) => company!.id == companyId);
final company = state.companies
.firstWhere((company) => company!.id == companyId)!;
final index = state.companies.indexOf(company);
widget.viewModel.onCompanyChanged(context, index, company);
}
@ -332,8 +332,8 @@ class _MenuDrawerState extends State<MenuDrawer> {
widget.viewModel.onAddCompany(context);
} else {
final index = int.parse(value);
widget.viewModel
.onCompanyChanged(context, index, state.companies[index]);
widget.viewModel.onCompanyChanged(
context, index, state.companies[index]!);
}
},
),
@ -486,7 +486,8 @@ class _MenuDrawerState extends State<MenuDrawer> {
child: ListTile(
tileColor: Colors.orange.shade800,
subtitle: Text(
localization.verifyPhoneNumber2faHelp!,
localization
.verifyPhoneNumber2faHelp!,
style: TextStyle(color: Colors.white),
),
onTap: () {
@ -1314,8 +1315,9 @@ class SidebarFooterCollapsed extends StatelessWidget {
Icons.chevron_right,
color: state.isUpdateAvailable ? state.accentColor : null,
),
tooltip:
state.prefState.enableTooltips ? localization!.showMenu : null,
tooltip: state.prefState.enableTooltips
? localization!.showMenu
: null,
onPressed: () {
store.dispatch(UpdateUserPreferences(sidebar: AppSidebar.menu));
},

View File

@ -54,7 +54,7 @@ class MenuDrawerVM {
final CompanyEntity? selectedCompany;
final UserEntity? user;
final String selectedCompanyIndex;
final Function(BuildContext context, int, CompanyEntity?) onCompanyChanged;
final Function(BuildContext context, int, CompanyEntity) onCompanyChanged;
final Function(BuildContext context) onAddCompany;
final Function(BuildContext) onLogoutTap;
@ -140,7 +140,7 @@ class MenuDrawerVM {
shouldPop: true)
..future.then((value) {
AppBuilder.of(navigatorKey.currentContext!)!.rebuild();
} as FutureOr<_> Function(Null));
} as FutureOr<Null> Function(Null));
store
.dispatch(AddCompany(context: context, completer: completer));

View File

@ -184,11 +184,13 @@ class _LoginState extends State<LoginView> {
}
final Completer<Null> completer = Completer<Null>();
completer.future.then((_) {
completer.future
.then((_) {
setState(() {
_loginError = '';
});
} as FutureOr<_> Function(Null)).catchError((Object error) {
} as FutureOr<_> Function(Null))
.catchError((Object error) {
setState(() {
_buttonController.reset();
_loginError = error.toString();
@ -225,7 +227,8 @@ class _LoginState extends State<LoginView> {
}
final Completer<Null> completer = Completer<Null>();
completer.future.then((_) {
completer.future
.then<Null>(() {
setState(() {
_loginError = '';
if (_recoverPassword) {
@ -240,7 +243,8 @@ class _LoginState extends State<LoginView> {
});
}
});
} as FutureOr<_> Function(Null)).catchError((Object error) {
} as FutureOr<Null> Function(Null))
.catchError((Object error) {
setState(() {
_buttonController.reset();
_loginError = error.toString();
@ -512,7 +516,8 @@ class _LoginState extends State<LoginView> {
children: <TextSpan>[
TextSpan(
style: aboutTextStyle,
text: localization!.iAgreeToThe +
text:
localization!.iAgreeToThe +
' ',
),
LinkTextSpan(

View File

@ -115,7 +115,9 @@ class LoginVM {
onMicrosoftSignUpPressed;
final Function(BuildContext, Completer<Null> completer,
{String url, String? secret, String? oneTimePassword}) onAppleLoginPressed;
{String url,
String? secret,
String? oneTimePassword}) onAppleLoginPressed;
final Function(BuildContext, Completer<Null> completer, String? url)
onAppleSignUpPressed;
@ -184,7 +186,8 @@ class LoginVM {
provider: UserEntity.OAUTH_PROVIDER_GOOGLE,
oneTimePassword: oneTimePassword,
));
completer.future.then(((_) => _handleLogin(context: context)) as FutureOr<_> Function(Null));
completer.future.then<Null>((() => _handleLogin(context: context))
as FutureOr<Null> Function(Null));
}
});
if (!signedIn) {
@ -214,8 +217,9 @@ class LoginVM {
accessToken: accessToken,
provider: UserEntity.OAUTH_PROVIDER_GOOGLE,
));
completer.future
.then(((_) => _handleLogin(context: context, isSignUp: true)) as FutureOr<_> Function(Null));
completer.future.then<Null>((() =>
_handleLogin(context: context, isSignUp: true))
as FutureOr<Null> Function(Null));
}
});
if (!signedIn) {
@ -231,9 +235,9 @@ class LoginVM {
onMicrosoftLoginPressed: (
BuildContext context,
Completer<Null> completer, {
required String url,
required String secret,
required String oneTimePassword,
String url = '',
String secret = '',
String oneTimePassword = '',
}) async {
try {
WebUtils.microsoftLogin((idToken, accessToken) {
@ -247,7 +251,8 @@ class LoginVM {
provider: UserEntity.OAUTH_PROVIDER_MICROSOFT,
oneTimePassword: oneTimePassword,
));
completer.future.then(((_) => _handleLogin(context: context)) as FutureOr<_> Function(Null));
completer.future.then<Null>((() => _handleLogin(context: context))
as FutureOr<Null> Function(Null));
}, (dynamic error) {
completer.completeError(error);
});
@ -267,8 +272,9 @@ class LoginVM {
provider: UserEntity.OAUTH_PROVIDER_MICROSOFT,
accessToken: accessToken,
));
completer.future
.then(((_) => _handleLogin(context: context, isSignUp: true)) as FutureOr<_> Function(Null));
completer.future.then<Null>((() =>
_handleLogin(context: context, isSignUp: true))
as FutureOr<Null> Function(Null));
}, (dynamic error) {
completer.completeError(error);
});
@ -307,7 +313,8 @@ class LoginVM {
authCode: credentials.authorizationCode,
idToken: credentials.identityToken,
));
completer.future.then(((_) => _handleLogin(context: context)) as FutureOr<_> Function(Null));
completer.future.then<Null>((() => _handleLogin(context: context))
as FutureOr<Null> Function(Null));
} catch (error) {
completer.completeError(error);
print('## onAppleLoginPressed: $error');
@ -335,8 +342,9 @@ class LoginVM {
firstName: credentials.givenName,
lastName: credentials.familyName,
));
completer.future
.then(((_) => _handleLogin(context: context, isSignUp: true)) as FutureOr<_> Function(Null));
completer.future.then<Null>((() =>
_handleLogin(context: context, isSignUp: true))
as FutureOr<Null> Function(Null));
} catch (error) {
completer.completeError(error);
print('## onAppleSignUpPressed: $error');
@ -357,8 +365,9 @@ class LoginVM {
email: email.trim(),
password: password.trim(),
));
completer.future
.then(((_) => _handleLogin(context: context, isSignUp: true)) as FutureOr<_> Function(Null));
completer.future.then<Null>((() =>
_handleLogin(context: context, isSignUp: true))
as FutureOr<Null> Function(Null));
},
onRecoverPressed: (
BuildContext context,
@ -400,7 +409,8 @@ class LoginVM {
platform: getPlatform(context),
oneTimePassword: oneTimePassword.trim(),
));
completer.future.then(((_) => _handleLogin(context: context)) as FutureOr<_> Function(Null));
completer.future.then<Null>((() => _handleLogin(context: context))
as FutureOr<Null> Function(Null));
},
onTokenLoginPressed: (BuildContext context, Completer<Null> completer,
{required String token}) async {

View File

@ -59,7 +59,8 @@ class EmailCreditVM extends EmailEntityVM {
ClientEntity? client,
VendorEntity? vendor,
Function? loadClient,
Function(BuildContext, EmailTemplate, String, String, String)? onSendPressed,
Function(BuildContext, EmailTemplate, String, String, String)?
onSendPressed,
}) : super(
state: state,
isLoading: isLoading,
@ -91,7 +92,7 @@ class EmailCreditVM extends EmailEntityVM {
if (!isMobile(context)) {
completer.future.then((value) {
viewEntity(entity: credit);
} as FutureOr<_> Function(Null));
} as FutureOr<Null> Function(Null));
}
store.dispatch(EmailCreditRequest(
completer: completer,

View File

@ -103,7 +103,7 @@ class CreditEditDetailsVM extends EntityEditDetailsVM {
cancelCompleter: Completer<Null>()
..future.then((_) {
store.dispatch(UpdateCurrentRoute(CreditEditScreen.route));
} as FutureOr<_> Function(Null)));
} as FutureOr<Null> Function(Null)));
completer.future.then((SelectableEntity client) {
store.dispatch(UpdateCurrentRoute(CreditEditScreen.route));
});

View File

@ -131,7 +131,7 @@ class InvoiceEditDetailsVM extends EntityEditDetailsVM {
cancelCompleter: Completer<Null>()
..future.then((_) {
store.dispatch(UpdateCurrentRoute(InvoiceEditScreen.route));
} as FutureOr<_> Function(Null)));
} as FutureOr<Null> Function(Null)));
completer.future.then((SelectableEntity client) {
store.dispatch(UpdateCurrentRoute(InvoiceEditScreen.route));
});

View File

@ -81,7 +81,8 @@ class EmailInvoiceVM extends EmailEntityVM {
InvoiceEntity? invoice,
ClientEntity? client,
VendorEntity? vendor,
Function(BuildContext, EmailTemplate, String, String, String)? onSendPressed,
Function(BuildContext, EmailTemplate, String, String, String)?
onSendPressed,
}) : super(
state: state,
isLoading: isLoading,
@ -112,7 +113,7 @@ class EmailInvoiceVM extends EmailEntityVM {
if (!isMobile(context)) {
completer.future.then((value) {
viewEntity(entity: invoice);
} as FutureOr<_> Function(Null));
} as FutureOr<Null> Function(Null));
}
store.dispatch(EmailInvoiceRequest(
completer: completer,

View File

@ -90,7 +90,7 @@ class ProjectEditVM {
cancelCompleter: Completer<Null>()
..future.then((_) {
store.dispatch(UpdateCurrentRoute(ProjectEditScreen.route));
} as FutureOr<_> Function(Null)));
} as FutureOr<Null> Function(Null)));
completer.future.then((SelectableEntity client) {
store.dispatch(UpdateCurrentRoute(ProjectEditScreen.route));
});

View File

@ -106,7 +106,7 @@ class PurchaseOrderEditDetailsVM extends EntityEditDetailsVM {
..future.then((_) {
store.dispatch(
UpdateCurrentRoute(PurchaseOrderEditScreen.route));
} as FutureOr<_> Function(Null)));
} as FutureOr<Null> Function(Null)));
completer.future.then((SelectableEntity client) {
store.dispatch(UpdateCurrentRoute(PurchaseOrderEditScreen.route));
});

View File

@ -58,8 +58,7 @@ class EmailPurchaseOrderVM extends EmailEntityVM {
required InvoiceEntity invoice,
required ClientEntity? client,
required VendorEntity? vendor,
required
Function(BuildContext, EmailTemplate, String, String, String)
required Function(BuildContext, EmailTemplate, String, String, String)
onSendPressed,
}) : super(
state: state,
@ -91,7 +90,7 @@ class EmailPurchaseOrderVM extends EmailEntityVM {
if (!isMobile(context)) {
completer.future.then((value) {
viewEntity(entity: purchaseOrder);
} as FutureOr<_> Function(Null));
} as FutureOr<Null> Function(Null));
}
store.dispatch(EmailPurchaseOrderRequest(
completer: completer,

View File

@ -102,7 +102,7 @@ class QuoteEditDetailsVM extends EntityEditDetailsVM {
cancelCompleter: Completer<Null>()
..future.then((_) {
store.dispatch(UpdateCurrentRoute(QuoteEditScreen.route));
} as FutureOr<_> Function(Null)));
} as FutureOr<Null> Function(Null)));
completer.future.then((SelectableEntity client) {
store.dispatch(UpdateCurrentRoute(QuoteEditScreen.route));
});

View File

@ -58,8 +58,7 @@ class EmailQuoteVM extends EmailEntityVM {
required InvoiceEntity invoice,
required ClientEntity? client,
required VendorEntity? vendor,
required
Function(BuildContext, EmailTemplate, String, String, String)
required Function(BuildContext, EmailTemplate, String, String, String)
onSendPressed,
}) : super(
state: state,
@ -90,7 +89,7 @@ class EmailQuoteVM extends EmailEntityVM {
if (!isMobile(context)) {
completer.future.then((value) {
viewEntity(entity: quote);
} as FutureOr<_> Function(Null));
} as FutureOr<Null> Function(Null));
}
store.dispatch(EmailQuoteRequest(
completer: completer,

View File

@ -62,7 +62,8 @@ class RecurringExpenseEditVM extends AbstractExpenseEditVM {
state: state,
expense: expense,
onChanged: onChanged,
onSavePressed: onSavePressed as dynamic Function(BuildContext, [EntityAction])?,
onSavePressed:
onSavePressed as dynamic Function(BuildContext, [EntityAction])?,
onCancelPressed: onCancelPressed,
origExpense: origExpense,
onAddClientPressed: onAddClientPressed,
@ -93,7 +94,7 @@ class RecurringExpenseEditVM extends AbstractExpenseEditVM {
..future.then((_) {
store.dispatch(
UpdateCurrentRoute(RecurringExpenseEditScreen.route));
} as FutureOr<_> Function(Null)));
} as FutureOr<Null> Function(Null)));
completer.future.then((SelectableEntity client) {
store.dispatch(UpdateCurrentRoute(RecurringExpenseEditScreen.route));
});
@ -108,7 +109,7 @@ class RecurringExpenseEditVM extends AbstractExpenseEditVM {
..future.then((_) {
store.dispatch(
UpdateCurrentRoute(RecurringExpenseEditScreen.route));
} as FutureOr<_> Function(Null)));
} as FutureOr<Null> Function(Null)));
completer.future.then((SelectableEntity expense) {
store.dispatch(UpdateCurrentRoute(RecurringExpenseEditScreen.route));
});

View File

@ -106,7 +106,7 @@ class RecurringInvoiceEditDetailsVM extends EntityEditDetailsVM {
..future.then((_) {
store.dispatch(
UpdateCurrentRoute(RecurringInvoiceEditScreen.route));
} as FutureOr<_> Function(Null)));
} as FutureOr<Null> Function(Null)));
completer.future.then((SelectableEntity client) {
store.dispatch(UpdateCurrentRoute(RecurringInvoiceEditScreen.route));
});

View File

@ -73,7 +73,8 @@ class AccountManagementVM {
final companyLength = state.companies.length;
final deleteCompleter = Completer<Null>()
..future.then((value) {
..future
.then((value) {
final context = navigatorKey.currentContext;
final state = store.state;
if (companyLength == 1) {
@ -94,11 +95,12 @@ class AccountManagementVM {
if (Navigator.of(context!).canPop()) {
Navigator.of(context).pop();
}
} as FutureOr<_> Function(Null));
} as FutureOr<Null> Function(Null));
store.dispatch(
RefreshData(clearData: true, completer: refreshCompleter));
}
} as FutureOr<_> Function(Null)).catchError((Object error) {
} as FutureOr<_> Function(Null))
.catchError((Object error) {
if (Navigator.of(navigatorKey.currentContext!).canPop()) {
Navigator.of(navigatorKey.currentContext!).pop();
}

View File

@ -83,7 +83,7 @@ class ClientPortalVM {
completer.future.then((value) {
showRefreshDataDialog(
context: navigatorKey.currentContext!);
} as FutureOr<_> Function(Null));
} as FutureOr<Null> Function(Null));
}
store.dispatch(SaveCompanyRequest(

View File

@ -105,7 +105,7 @@ class InvoiceDesignVM {
showErrorDialog(message: '$error');
});
});
} as FutureOr<_> Function(Null));
} as FutureOr<Null> Function(Null));
store.dispatch(SaveCompanyRequest(
completer: completer, company: settingsUIState.company));
break;

View File

@ -96,7 +96,8 @@ class TemplatesAndRemindersVM {
case EntityType.company:
final completer = snackBarCompleter<Null>(
context, AppLocalization.of(context)!.savedSettings);
completer.future.then(((value) => callback()) as FutureOr<_> Function(Null));
completer.future.then(
((value) => callback()) as FutureOr<Null> Function(Null));
store.dispatch(SaveCompanyRequest(
completer: completer, company: settingsUIState.company));
break;

View File

@ -109,8 +109,8 @@ class UserDetailsVM {
passwordCallback(
context: context,
callback: (password, idToken) {
final completer = snackBarCompleter<Null>(
context, AppLocalization.of(context)!.disconnectedEmail);
final completer = snackBarCompleter<Null>(context,
AppLocalization.of(context)!.disconnectedEmail);
store.dispatch(
DisconnectOAuthMailerRequest(
user: state.user,
@ -128,8 +128,8 @@ class UserDetailsVM {
passwordCallback(
context: context,
callback: (password, idToken) {
final completer = snackBarCompleter<Null>(
context, AppLocalization.of(context)!.disconnectedGmail);
final completer = snackBarCompleter<Null>(context,
AppLocalization.of(context)!.disconnectedGmail);
store.dispatch(
DisconnectOAuthMailerRequest(
user: state.user,
@ -178,7 +178,7 @@ class UserDetailsVM {
AppLocalization.of(context)!.disconnectedGoogle);
completer.future.then((value) {
GoogleOAuth.disconnect();
} as FutureOr<_> Function(Null));
} as FutureOr<Null> Function(Null));
store.dispatch(
DisconnecOAuthUserRequest(
user: state.user,
@ -268,8 +268,8 @@ class UserDetailsVM {
context: context,
skipOAuth: true,
callback: (password, idToken) {
final completer = snackBarCompleter<Null>(
context, AppLocalization.of(context)!.disconnectedApple);
final completer = snackBarCompleter<Null>(context,
AppLocalization.of(context)!.disconnectedApple);
store.dispatch(
DisconnecOAuthUserRequest(
user: state.user,
@ -338,7 +338,7 @@ class UserDetailsVM {
}
appBuilder!.rebuild();
} as FutureOr<_> Function(Null));
} as FutureOr<Null> Function(Null));
confirmCallback(
context: context,

View File

@ -84,7 +84,7 @@ class TaskEditDetailsVM {
cancelCompleter: Completer<Null>()
..future.then((_) {
store.dispatch(UpdateCurrentRoute(TaskEditDetailsScreen.route));
} as FutureOr<_> Function(Null)));
} as FutureOr<Null> Function(Null)));
completer.future.then((SelectableEntity client) {
store.dispatch(UpdateCurrentRoute(TaskEditDetailsScreen.route));
});
@ -109,7 +109,7 @@ class TaskEditDetailsVM {
cancelCompleter: Completer<Null>()
..future.then((_) {
store.dispatch(UpdateCurrentRoute(TaskEditDetailsScreen.route));
} as FutureOr<_> Function(Null)));
} as FutureOr<Null> Function(Null)));
completer.future.then((SelectableEntity client) {
store.dispatch(UpdateCurrentRoute(TaskEditDetailsScreen.route));
});

View File

@ -112,7 +112,7 @@ class TransactionEditVM {
cancelCompleter: Completer<Null>()
..future.then((_) {
store.dispatch(UpdateCurrentRoute(TransactionEditScreen.route));
} as FutureOr<_> Function(Null)));
} as FutureOr<Null> Function(Null)));
completer.future.then((SelectableEntity client) {
store.dispatch(UpdateCurrentRoute(TransactionEditScreen.route));
});

View File

@ -943,8 +943,8 @@ class _MatchWithdrawalsState extends State<_MatchWithdrawals> {
updateExpenseList();
});
},
placeholder:
localization!.searchExpenses.replaceFirst(':count ', ''),
placeholder: localization!.searchExpenses
.replaceFirst(':count ', ''),
),
),
),
@ -1112,7 +1112,7 @@ class _MatchWithdrawalsState extends State<_MatchWithdrawals> {
..future.then((_) {
store.dispatch(UpdateCurrentRoute(
TransactionScreen.route));
} as FutureOr<_> Function(Null)));
} as FutureOr<Null> Function(Null)));
completer.future.then((SelectableEntity vendor) {
store.dispatch(SaveTransactionSuccess(transaction
.rebuild((b) => b..pendingVendorId = vendor.id)));
@ -1196,7 +1196,7 @@ class _MatchWithdrawalsState extends State<_MatchWithdrawals> {
..future.then((_) {
store.dispatch(UpdateCurrentRoute(
TransactionScreen.route));
} as FutureOr<_> Function(Null)));
} as FutureOr<Null> Function(Null)));
completer.future.then((SelectableEntity category) {
store.dispatch(SaveTransactionSuccess(
transaction.rebuild(