Flutter upgrade

This commit is contained in:
Hillel Coren 2023-10-10 12:00:37 +03:00
parent d05e98d15f
commit 12855222d0
37 changed files with 358 additions and 246 deletions

View File

@ -1,11 +1,11 @@
# This file tracks properties of this Flutter project. # This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc. # Used by Flutter tool to assess capabilities and perform upgrades etc.
# #
# This file should be version controlled. # This file should be version controlled and should not be manually edited.
version: version:
revision: c07f7888888435fd9df505aa2efc38d3cf65681b revision: "ead455963c12b453cdb2358cad34969c76daf180"
channel: stable channel: "stable"
project_type: app project_type: app
@ -13,11 +13,11 @@ project_type: app
migration: migration:
platforms: platforms:
- platform: root - platform: root
create_revision: c07f7888888435fd9df505aa2efc38d3cf65681b create_revision: ead455963c12b453cdb2358cad34969c76daf180
base_revision: c07f7888888435fd9df505aa2efc38d3cf65681b base_revision: ead455963c12b453cdb2358cad34969c76daf180
- platform: linux - platform: windows
create_revision: c07f7888888435fd9df505aa2efc38d3cf65681b create_revision: ead455963c12b453cdb2358cad34969c76daf180
base_revision: c07f7888888435fd9df505aa2efc38d3cf65681b base_revision: ead455963c12b453cdb2358cad34969c76daf180
# User provided section # User provided section

View File

@ -22,8 +22,6 @@
# in sync with this file. # in sync with this file.
analyzer: analyzer:
strong-mode:
implicit-dynamic: false
errors: errors:
# https://github.com/flutter/flutter/issues/41563#issuecomment-686481533 # https://github.com/flutter/flutter/issues/41563#issuecomment-686481533
undefined_prefixed_name: ignore undefined_prefixed_name: ignore
@ -51,7 +49,7 @@ linter:
- always_declare_return_types - always_declare_return_types
- always_put_control_body_on_new_line - always_put_control_body_on_new_line
# - always_put_required_named_parameters_first # we prefer having parameters in the same order as fields https://github.com/flutter/flutter/issues/10219 # - always_put_required_named_parameters_first # we prefer having parameters in the same order as fields https://github.com/flutter/flutter/issues/10219
- always_require_non_null_named_parameters # - always_require_non_null_named_parameters # deprecated
# - always_specify_types # not support by built_value # - always_specify_types # not support by built_value
- annotate_overrides - annotate_overrides
# - avoid_annotating_with_dynamic # conflicts with always_specify_types # - avoid_annotating_with_dynamic # conflicts with always_specify_types
@ -92,11 +90,11 @@ linter:
# hash_and_equals # For built_value memoized hash # hash_and_equals # For built_value memoized hash
- implementation_imports - implementation_imports
# - invariant_booleans # https://github.com/flutter/flutter/issues/5790 # - invariant_booleans # https://github.com/flutter/flutter/issues/5790
- iterable_contains_unrelated_type # - iterable_contains_unrelated_type # deprecated
# - join_return_with_assignment # not yet tested # - join_return_with_assignment # not yet tested
- library_names - library_names
- library_prefixes - library_prefixes
- list_remove_unrelated_type # - list_remove_unrelated_type # deprecated
# - literal_only_boolean_expressions # https://github.com/flutter/flutter/issues/5791 # - literal_only_boolean_expressions # https://github.com/flutter/flutter/issues/5791
- no_adjacent_strings_in_list - no_adjacent_strings_in_list
- no_duplicate_case_values - no_duplicate_case_values

View File

@ -315,7 +315,7 @@ class UserPermission extends EnumClass {
static UserPermission valueOf(String name) => _$permissionValueOf(name); static UserPermission valueOf(String name) => _$permissionValueOf(name);
} }
abstract class EntityStatus { abstract mixin class EntityStatus {
String get id; String get id;
String get name; String get name;
@ -352,7 +352,7 @@ class EntityStats {
} }
} }
abstract class SelectableEntity { abstract mixin class SelectableEntity {
String get id; String get id;
bool matchesFilter(String? filter) => true; bool matchesFilter(String? filter) => true;
@ -376,7 +376,7 @@ class EntityFields {
static const String isDeleted = 'is_deleted'; static const String isDeleted = 'is_deleted';
} }
abstract class BaseEntity implements SelectableEntity { abstract mixin class BaseEntity implements SelectableEntity {
static int counter = 0; static int counter = 0;
static String get nextId => '${--counter}'; static String get nextId => '${--counter}';
@ -534,7 +534,7 @@ abstract class BaseEntity implements SelectableEntity {
} }
} }
abstract class HasActivities { abstract mixin class HasActivities {
BuiltList<ActivityEntity> get activities; BuiltList<ActivityEntity> get activities;
Iterable<ActivityEntity> getActivities({String? invoiceId, String? typeId}) { Iterable<ActivityEntity> getActivities({String? invoiceId, String? typeId}) {
@ -550,11 +550,11 @@ abstract class HasActivities {
} }
} }
abstract class BelongsToClient { abstract mixin class BelongsToClient {
String? get clientId; String? get clientId;
} }
abstract class BelongsToVendor { abstract mixin class BelongsToVendor {
String get vendorId; String get vendorId;
} }

View File

@ -7,7 +7,7 @@ import 'package:built_collection/built_collection.dart';
import 'package:invoiceninja_flutter/data/models/invoice_model.dart'; import 'package:invoiceninja_flutter/data/models/invoice_model.dart';
import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart';
abstract class CalculateInvoiceTotal { abstract mixin class CalculateInvoiceTotal {
bool get isAmountDiscount; bool get isAmountDiscount;
String get taxName1; String get taxName1;

View File

@ -520,13 +520,13 @@ abstract class TaskEntity extends Object
if (taskItem[0] == false || taskItem[0] == null) { if (taskItem[0] == false || taskItem[0] == null) {
startDate = 0; startDate = 0;
} else { } else {
startDate = (taskItem[0]).round(); startDate = taskItem[0].round();
} }
if (taskItem[1] == false || taskItem[1] == null) { if (taskItem[1] == false || taskItem[1] == null) {
endDate = 0; endDate = 0;
} else { } else {
endDate = (taskItem[1]).round(); endDate = taskItem[1].round();
} }
final taskTime = TaskTime( final taskTime = TaskTime(

View File

@ -193,10 +193,12 @@ void main({bool isTesting = false}) async {
event = event.copyWith( event = event.copyWith(
environment: '${store.state.environment}'.split('.').last, environment: '${store.state.environment}'.split('.').last,
/*
extra: <String, dynamic>{ extra: <String, dynamic>{
'server_version': account.currentVersion, 'server_version': account.currentVersion,
'route': state.uiState.currentRoute, 'route': state.uiState.currentRoute,
}, },
*/
); );
return event; return event;

View File

@ -172,14 +172,6 @@ class InvoiceNinjaAppState extends State<InvoiceNinjaApp> {
void initState() { void initState() {
super.initState(); super.initState();
final window = WidgetsBinding.instance.window;
window.onPlatformBrightnessChanged = () {
WidgetsBinding.instance.handlePlatformBrightnessChanged();
widget.store!.dispatch(UpdateUserPreferences(
enableDarkModeSystem: window.platformBrightness == Brightness.dark));
setState(() {});
};
if (kIsWeb) { if (kIsWeb) {
WebUtils.warnChanges(widget.store); WebUtils.warnChanges(widget.store);
} }
@ -235,6 +227,11 @@ class InvoiceNinjaAppState extends State<InvoiceNinjaApp> {
if (state.prefState.requireAuthentication && !_authenticated) { if (state.prefState.requireAuthentication && !_authenticated) {
_authenticate(); _authenticate();
} }
final brightness = MediaQuery.of(context).platformBrightness;
widget.store!.dispatch(UpdateUserPreferences(
enableDarkModeSystem: brightness == Brightness.dark));
super.didChangeDependencies(); super.didChangeDependencies();
} }

View File

@ -262,7 +262,7 @@ Middleware<AppState> _createRefreshRequest(AuthRepository repository) {
String token; String token;
bool hasToken = false; bool hasToken = false;
if ((state.userCompany.token.token).isNotEmpty) { if (state.userCompany.token.token.isNotEmpty) {
token = state.userCompany.token.token; token = state.userCompany.token.token;
hasToken = true; hasToken = true;
} else { } else {

View File

@ -199,7 +199,7 @@ List<String?> taskList(
final list = taskMap.keys.where((taskId) { final list = taskMap.keys.where((taskId) {
final task = taskMap[taskId]; final task = taskMap[taskId];
if ((clientId ?? '').isNotEmpty && if ((clientId ?? '').isNotEmpty &&
(task!.clientId).isNotEmpty && task!.clientId.isNotEmpty &&
task.clientId != clientId) { task.clientId != clientId) {
return false; return false;
} }

View File

@ -8,7 +8,7 @@ import 'package:built_value/built_value.dart';
import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/data/models/entities.dart';
import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart'; import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart';
abstract class EntityUIState { abstract mixin class EntityUIState {
bool get isCreatingNew; bool get isCreatingNew;
String get editingId; String get editingId;

View File

@ -1,5 +1,4 @@
// Dart imports: // Dart imports:
import 'dart:convert';
// Flutter imports: // Flutter imports:
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
@ -59,12 +58,17 @@ class _MobileWebViewState extends State<_MobileWebView>
super.didUpdateWidget(oldWidget); super.didUpdateWidget(oldWidget);
if (widget.html != oldWidget.html) { if (widget.html != oldWidget.html) {
_webViewController.loadHtmlString(widget.html!);
/*
_webViewController.loadUrl(Uri.dataFromString(widget.html!, _webViewController.loadUrl(Uri.dataFromString(widget.html!,
mimeType: 'text/html', encoding: Encoding.getByName('utf-8')) mimeType: 'text/html', encoding: Encoding.getByName('utf-8'))
.toString()); .toString());
*/
} }
} }
/*
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
super.build(context); super.build(context);
@ -79,4 +83,5 @@ class _MobileWebViewState extends State<_MobileWebView>
javascriptMode: JavascriptMode.disabled, javascriptMode: JavascriptMode.disabled,
); );
} }
*/
} }

View File

@ -33,8 +33,10 @@ class CopyToClipboard extends StatelessWidget {
) )
: child; : child;
final localization = AppLocalization.of(context); final localization = AppLocalization.of(context);
final onTap = () { final onTap = value == null
Clipboard.setData(ClipboardData(text: value)); ? null
: () {
Clipboard.setData(ClipboardData(text: value!));
var valueStr = value!.replaceAll('\n', ' '); var valueStr = value!.replaceAll('\n', ' ');
if (value!.length > 20) { if (value!.length > 20) {

View File

@ -440,7 +440,7 @@ class _InvoiceEmailViewState extends State<InvoiceEmailView>
return EditScaffold( return EditScaffold(
entity: invoice, entity: invoice,
title: localization!.sendEmail, title: localization!.sendEmail,
onCancelPressed: (context) => viewEntity(entity: invoice!), onCancelPressed: (context) => viewEntity(entity: invoice),
saveLabel: localization.send, saveLabel: localization.send,
onSavePressed: (context) { onSavePressed: (context) {
if (state!.account.accountSmsVerified || state.isSelfHosted) { if (state!.account.accountSmsVerified || state.isSelfHosted) {
@ -522,7 +522,7 @@ class _InvoiceEmailViewState extends State<InvoiceEmailView>
child: EditScaffold( child: EditScaffold(
entity: invoice, entity: invoice,
title: localization!.sendEmail, title: localization!.sendEmail,
onCancelPressed: (context) => viewEntity(entity: invoice!), onCancelPressed: (context) => viewEntity(entity: invoice),
appBarBottom: TabBar( appBarBottom: TabBar(
controller: _controller, controller: _controller,
isScrollable: true, isScrollable: true,

View File

@ -34,7 +34,7 @@ class AppListTile extends StatelessWidget {
return; return;
} }
Clipboard.setData(ClipboardData(text: copyValue ?? title)); Clipboard.setData(ClipboardData(text: copyValue ?? title ?? ''));
showToast(AppLocalization.of(context)! showToast(AppLocalization.of(context)!
.copiedToClipboard .copiedToClipboard
.replaceFirst(':value', copyValue ?? title!)); .replaceFirst(':value', copyValue ?? title!));

View File

@ -280,7 +280,7 @@ class _MenuDrawerState extends State<MenuDrawer> {
items: [ items: [
...state.companies ...state.companies
.map((CompanyEntity company) => DropdownMenuItem<String>( .map((CompanyEntity company) => DropdownMenuItem<String>(
value: (state.companies.indexOf(company)).toString(), value: state.companies.indexOf(company).toString(),
child: _companyListItem(company))) child: _companyListItem(company)))
.toList(), .toList(),
if (state.canAddCompany) if (state.canAddCompany)

View File

@ -1,3 +1,4 @@
/*
// Copyright 2014 The Flutter Authors. All rights reserved. // Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
@ -1003,3 +1004,5 @@ class _NullWidget extends Widget {
@override @override
Element createElement() => throw UnimplementedError(); Element createElement() => throw UnimplementedError();
} }
*/

View File

@ -1,3 +1,4 @@
/*
// Copyright 2014 The Flutter Authors. All rights reserved. // Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
@ -63,3 +64,4 @@ abstract class AppDataTableSource extends ChangeNotifier {
/// If the selected row count changes, call [notifyListeners]. /// If the selected row count changes, call [notifyListeners].
int get selectedRowCount; int get selectedRowCount;
} }
*/

View File

@ -1,3 +1,4 @@
/*
// Copyright 2014 The Flutter Authors. All rights reserved. // Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
@ -518,3 +519,4 @@ class AppPaginatedDataTableState extends State<AppPaginatedDataTable> {
); );
} }
} }
*/

View File

@ -1,8 +1,8 @@
// Flutter imports: // Flutter imports:
import 'package:flutter/material.dart' hide DataRow, DataCell, DataColumn;
// Package imports: // Package imports:
import 'package:built_collection/built_collection.dart'; import 'package:built_collection/built_collection.dart';
import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter_redux/flutter_redux.dart';
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
@ -14,13 +14,11 @@ import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/ui/pref_state.dart'; import 'package:invoiceninja_flutter/redux/ui/pref_state.dart';
import 'package:invoiceninja_flutter/ui/app/actions_menu_button.dart'; import 'package:invoiceninja_flutter/ui/app/actions_menu_button.dart';
import 'package:invoiceninja_flutter/ui/app/presenters/entity_presenter.dart'; import 'package:invoiceninja_flutter/ui/app/presenters/entity_presenter.dart';
import 'package:invoiceninja_flutter/ui/app/tables/app_data_table.dart';
import 'package:invoiceninja_flutter/ui/app/tables/app_data_table_source.dart';
import 'package:invoiceninja_flutter/utils/colors.dart'; import 'package:invoiceninja_flutter/utils/colors.dart';
import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:invoiceninja_flutter/utils/platforms.dart'; import 'package:invoiceninja_flutter/utils/platforms.dart';
class EntityDataTableSource extends AppDataTableSource { class EntityDataTableSource extends DataTableSource {
EntityDataTableSource( EntityDataTableSource(
{required this.context, {required this.context,
required this.editingId, required this.editingId,
@ -129,7 +127,7 @@ class EntityDataTableSource extends AppDataTableSource {
], ],
), ),
onTap: () => onTap(entity), onTap: () => onTap(entity),
backgroundColor: backgroundColor, //backgroundColor: backgroundColor,
), ),
...tableColumns!.map( ...tableColumns!.map(
(field) => DataCell( (field) => DataCell(
@ -146,7 +144,7 @@ class EntityDataTableSource extends AppDataTableSource {
), ),
onTap: () => onTap(entity), onTap: () => onTap(entity),
//onLongPress: () => selectEntity(entity: entity, context: context, longPress: true), //onLongPress: () => selectEntity(entity: entity, context: context, longPress: true),
backgroundColor: backgroundColor, //backgroundColor: backgroundColor,
), ),
) )
], ],

View File

@ -5,7 +5,7 @@ import 'dart:math';
// Flutter imports: // Flutter imports:
import 'package:built_collection/built_collection.dart'; import 'package:built_collection/built_collection.dart';
import 'package:collection/collection.dart' show IterableNullableExtension; import 'package:collection/collection.dart' show IterableNullableExtension;
import 'package:flutter/material.dart' hide DataRow, DataCell, DataColumn; import 'package:flutter/material.dart';
// Package imports: // Package imports:
import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter_redux/flutter_redux.dart';
@ -26,8 +26,6 @@ import 'package:invoiceninja_flutter/ui/app/lists/list_filter.dart';
import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart'; import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart';
import 'package:invoiceninja_flutter/ui/app/presenters/entity_presenter.dart'; import 'package:invoiceninja_flutter/ui/app/presenters/entity_presenter.dart';
import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart';
import 'package:invoiceninja_flutter/ui/app/tables/app_data_table.dart';
import 'package:invoiceninja_flutter/ui/app/tables/app_paginated_data_table.dart';
import 'package:invoiceninja_flutter/ui/app/tables/entity_datatable.dart'; import 'package:invoiceninja_flutter/ui/app/tables/entity_datatable.dart';
import 'package:invoiceninja_flutter/utils/icons.dart'; import 'package:invoiceninja_flutter/utils/icons.dart';
import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/utils/localization.dart';
@ -247,8 +245,8 @@ class _EntityListState extends State<EntityList> {
primary: true, primary: true,
child: Padding( child: Padding(
padding: const EdgeInsets.symmetric(vertical: 16), padding: const EdgeInsets.symmetric(vertical: 16),
child: AppPaginatedDataTable( child: PaginatedDataTable(
hasActionsColumn: true, //hasActionsColumn: true,
onSelectAll: (value) { onSelectAll: (value) {
final startIndex = final startIndex =
min(_firstRowIndex, entityList.length - 1); min(_firstRowIndex, entityList.length - 1);
@ -294,11 +292,9 @@ class _EntityListState extends State<EntityList> {
sortAscending: listUIState.sortAscending, sortAscending: listUIState.sortAscending,
rowsPerPage: state.prefState.rowsPerPage, rowsPerPage: state.prefState.rowsPerPage,
onPageChanged: (row) { onPageChanged: (row) {
if (row != null) {
_firstRowIndex = row; _firstRowIndex = row;
store.dispatch(UpdateLastHistory( store.dispatch(UpdateLastHistory(
(row / state.prefState.rowsPerPage).floor())); (row / state.prefState.rowsPerPage).floor()));
}
}, },
initialFirstRowIndex: _firstRowIndex, initialFirstRowIndex: _firstRowIndex,
availableRowsPerPage: [ availableRowsPerPage: [
@ -469,7 +465,7 @@ class _EntityListState extends State<EntityList> {
multiselect: true, multiselect: true,
completer: Completer<Null>() completer: Completer<Null>()
..future.then<Null>( ..future.then<Null>(
((_) => widget.onClearMultiselect())), (_) => widget.onClearMultiselect()),
); );
}, },
onCancelPressed: (_) => widget.onClearMultiselect(), onCancelPressed: (_) => widget.onClearMultiselect(),

View File

@ -73,8 +73,8 @@ class CompanyGatewayScreen extends StatelessWidget {
entities: companyGateways, entities: companyGateways,
multiselect: true, multiselect: true,
completer: Completer<Null>() completer: Completer<Null>()
..future.then<Null>(((_) => ..future.then<Null>((_) =>
store.dispatch(ClearCompanyGatewayMultiselect()))), store.dispatch(ClearCompanyGatewayMultiselect())),
); );
}, },
onCancelPressed: (context) => onCancelPressed: (context) =>

View File

@ -1,8 +1,8 @@
// Flutter imports: // Flutter imports:
import 'package:collection/collection.dart' show IterableNullableExtension; import 'package:collection/collection.dart' show IterableNullableExtension;
import 'package:flutter/material.dart' hide DataRow, DataCell, DataColumn;
import 'package:flutter/material.dart' as mt; import 'package:flutter/material.dart' as mt;
import 'package:flutter/material.dart';
// Package imports: // Package imports:
import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter_redux/flutter_redux.dart';
@ -33,9 +33,6 @@ import 'package:invoiceninja_flutter/ui/app/history_drawer_vm.dart';
import 'package:invoiceninja_flutter/ui/app/menu_drawer_vm.dart'; import 'package:invoiceninja_flutter/ui/app/menu_drawer_vm.dart';
import 'package:invoiceninja_flutter/ui/app/presenters/entity_presenter.dart'; import 'package:invoiceninja_flutter/ui/app/presenters/entity_presenter.dart';
import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart';
import 'package:invoiceninja_flutter/ui/app/tables/app_data_table.dart';
import 'package:invoiceninja_flutter/ui/app/tables/app_data_table_source.dart';
import 'package:invoiceninja_flutter/ui/app/tables/app_paginated_data_table.dart';
import 'package:invoiceninja_flutter/ui/app/upgrade_dialog.dart'; import 'package:invoiceninja_flutter/ui/app/upgrade_dialog.dart';
import 'package:invoiceninja_flutter/ui/reports/report_charts.dart'; import 'package:invoiceninja_flutter/ui/reports/report_charts.dart';
import 'package:invoiceninja_flutter/ui/reports/reports_screen_vm.dart'; import 'package:invoiceninja_flutter/ui/reports/reports_screen_vm.dart';
@ -160,7 +157,8 @@ class ReportsScreen extends StatelessWidget {
final columnTitle = state.company.getCustomFieldLabel(column); final columnTitle = state.company.getCustomFieldLabel(column);
return DropdownMenuItem( return DropdownMenuItem(
child: Text(columnTitle.isEmpty child: Text(columnTitle.isEmpty
? localization.lookup(column): columnTitle), ? localization.lookup(column)
: columnTitle),
value: column, value: column,
); );
}).toList(), }).toList(),
@ -590,7 +588,7 @@ class _ReportDataTableState extends State<ReportDataTable> {
*/ */
// ignore: invalid_use_of_visible_for_testing_member, invalid_use_of_protected_member // ignore: invalid_use_of_visible_for_testing_member, invalid_use_of_protected_member
dataTableSource.notifyListeners(); //dataTableSource.notifyListeners();
} }
@override @override
@ -685,9 +683,9 @@ class _ReportDataTableState extends State<ReportDataTable> {
), ),
SingleChildScrollView( SingleChildScrollView(
padding: const EdgeInsets.all(12), padding: const EdgeInsets.all(12),
child: AppPaginatedDataTable( child: PaginatedDataTable(
//showFirstLastButtons: true, //showFirstLastButtons: true,
subtractOneFromCount: true, //subtractOneFromCount: true,
header: SizedBox(), header: SizedBox(),
sortColumnIndex: sortedColumns.contains(reportSettings.sortColumn) sortColumnIndex: sortedColumns.contains(reportSettings.sortColumn)
? sortedColumns.indexOf(reportSettings.sortColumn) ? sortedColumns.indexOf(reportSettings.sortColumn)
@ -794,7 +792,7 @@ ReportColumnType getReportColumnType(String? column, BuildContext context) {
} }
} }
class ReportDataTableSource extends AppDataTableSource { class ReportDataTableSource extends DataTableSource {
ReportDataTableSource({ ReportDataTableSource({
required this.context, required this.context,
required this.textEditingControllers, required this.textEditingControllers,
@ -1124,7 +1122,7 @@ class ReportResult {
)) ))
else if (getReportColumnType(column, context) == ReportColumnType.age) else if (getReportColumnType(column, context) == ReportColumnType.age)
DataCell(AppDropdownButton<String>( DataCell(AppDropdownButton<String>(
value: (textEditingControllers[column]!.text).isNotEmpty && value: textEditingControllers[column]!.text.isNotEmpty &&
textEditingControllers[column]!.text != 'null' textEditingControllers[column]!.text != 'null'
? textEditingControllers[column]!.text ? textEditingControllers[column]!.text
: null, : null,
@ -1464,7 +1462,8 @@ class ReportResult {
mt.DataColumn( mt.DataColumn(
label: Text( label: Text(
company.getCustomFieldLabel(column!).isEmpty company.getCustomFieldLabel(column!).isEmpty
? localization.lookup(column): company.getCustomFieldLabel(column), ? localization.lookup(column)
: company.getCustomFieldLabel(column),
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
), ),
numeric: true, numeric: true,

View File

@ -6,9 +6,7 @@ import 'package:flutter/services.dart';
// Package imports: // Package imports:
import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter_redux/flutter_redux.dart';
import 'package:flutter_styled_toast/flutter_styled_toast.dart'; import 'package:flutter_styled_toast/flutter_styled_toast.dart';
import 'package:invoiceninja_flutter/redux/company/company_selectors.dart';
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
import 'package:timeago/timeago.dart' as timeago;
// Project imports: // Project imports:
import 'package:invoiceninja_flutter/constants.dart'; import 'package:invoiceninja_flutter/constants.dart';
@ -22,11 +20,9 @@ import 'package:invoiceninja_flutter/ui/app/forms/app_dropdown_button.dart';
import 'package:invoiceninja_flutter/ui/app/forms/app_form.dart'; import 'package:invoiceninja_flutter/ui/app/forms/app_form.dart';
import 'package:invoiceninja_flutter/ui/app/forms/bool_dropdown_button.dart'; import 'package:invoiceninja_flutter/ui/app/forms/bool_dropdown_button.dart';
import 'package:invoiceninja_flutter/ui/app/forms/color_picker.dart'; import 'package:invoiceninja_flutter/ui/app/forms/color_picker.dart';
import 'package:invoiceninja_flutter/ui/app/live_text.dart';
import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart';
import 'package:invoiceninja_flutter/ui/settings/device_settings_vm.dart'; import 'package:invoiceninja_flutter/ui/settings/device_settings_vm.dart';
import 'package:invoiceninja_flutter/utils/dialogs.dart'; import 'package:invoiceninja_flutter/utils/dialogs.dart';
import 'package:invoiceninja_flutter/utils/formatting.dart';
import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:invoiceninja_flutter/utils/platforms.dart'; import 'package:invoiceninja_flutter/utils/platforms.dart';
import 'package:invoiceninja_flutter/utils/strings.dart'; import 'package:invoiceninja_flutter/utils/strings.dart';
@ -320,6 +316,7 @@ class _DeviceSettingsState extends State<DeviceSettings>
return ListTile( return ListTile(
leading: Icon(Icons.refresh), leading: Icon(Icons.refresh),
title: Text(localization.refreshData), title: Text(localization.refreshData),
/*
subtitle: LiveText(() { subtitle: LiveText(() {
if (state.userCompanyState.lastUpdated == 0) { if (state.userCompanyState.lastUpdated == 0) {
return ''; return '';
@ -336,6 +333,7 @@ class _DeviceSettingsState extends State<DeviceSettings>
onTap: () { onTap: () {
viewModel.onRefreshTap(context); viewModel.onRefreshTap(context);
}, },
*/
); );
}), }),
ListTile( ListTile(

View File

@ -79,7 +79,7 @@ class TaskStatusScreen extends StatelessWidget {
multiselect: true, multiselect: true,
completer: Completer<Null>() completer: Completer<Null>()
..future.then<Null>( ..future.then<Null>(
((_) => store.dispatch(ClearTaskStatusMultiselect()))), (_) => store.dispatch(ClearTaskStatusMultiselect())),
); );
}, },
label: localization!.actions, label: localization!.actions,

View File

@ -7,6 +7,7 @@
#include "generated_plugin_registrant.h" #include "generated_plugin_registrant.h"
#include <desktop_drop/desktop_drop_plugin.h> #include <desktop_drop/desktop_drop_plugin.h>
#include <file_selector_linux/file_selector_plugin.h>
#include <printing/printing_plugin.h> #include <printing/printing_plugin.h>
#include <screen_retriever/screen_retriever_plugin.h> #include <screen_retriever/screen_retriever_plugin.h>
#include <sentry_flutter/sentry_flutter_plugin.h> #include <sentry_flutter/sentry_flutter_plugin.h>
@ -18,6 +19,9 @@ void fl_register_plugins(FlPluginRegistry* registry) {
g_autoptr(FlPluginRegistrar) desktop_drop_registrar = g_autoptr(FlPluginRegistrar) desktop_drop_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "DesktopDropPlugin"); fl_plugin_registry_get_registrar_for_plugin(registry, "DesktopDropPlugin");
desktop_drop_plugin_register_with_registrar(desktop_drop_registrar); desktop_drop_plugin_register_with_registrar(desktop_drop_registrar);
g_autoptr(FlPluginRegistrar) file_selector_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin");
file_selector_plugin_register_with_registrar(file_selector_linux_registrar);
g_autoptr(FlPluginRegistrar) printing_registrar = g_autoptr(FlPluginRegistrar) printing_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "PrintingPlugin"); fl_plugin_registry_get_registrar_for_plugin(registry, "PrintingPlugin");
printing_plugin_register_with_registrar(printing_registrar); printing_plugin_register_with_registrar(printing_registrar);

View File

@ -4,6 +4,7 @@
list(APPEND FLUTTER_PLUGIN_LIST list(APPEND FLUTTER_PLUGIN_LIST
desktop_drop desktop_drop
file_selector_linux
printing printing
screen_retriever screen_retriever
sentry_flutter sentry_flutter

View File

@ -6,6 +6,7 @@ import FlutterMacOS
import Foundation import Foundation
import desktop_drop import desktop_drop
import file_selector_macos
import in_app_purchase_storekit import in_app_purchase_storekit
import in_app_review import in_app_review
import package_info import package_info
@ -25,6 +26,7 @@ import window_manager
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
DesktopDropPlugin.register(with: registry.registrar(forPlugin: "DesktopDropPlugin")) DesktopDropPlugin.register(with: registry.registrar(forPlugin: "DesktopDropPlugin"))
FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin"))
InAppPurchasePlugin.register(with: registry.registrar(forPlugin: "InAppPurchasePlugin")) InAppPurchasePlugin.register(with: registry.registrar(forPlugin: "InAppPurchasePlugin"))
InAppReviewPlugin.register(with: registry.registrar(forPlugin: "InAppReviewPlugin")) InAppReviewPlugin.register(with: registry.registrar(forPlugin: "InAppReviewPlugin"))
FLTPackageInfoPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlugin")) FLTPackageInfoPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlugin"))

View File

@ -37,10 +37,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: async name: async
sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.10.0" version: "2.11.0"
attributed_text: attributed_text:
dependency: transitive dependency: transitive
description: description:
@ -68,11 +68,12 @@ packages:
boardview: boardview:
dependency: "direct main" dependency: "direct main"
description: description:
name: boardview path: "."
sha256: a3319f868baf036b6c217dc4f35c152c4432207552433d94841aa8d3059c6170 ref: HEAD
url: "https://pub.dev" resolved-ref: "80cd60f55db250ea2c86ed5762e4c55337422efe"
source: hosted url: "https://github.com/BenPoell/FlutterBoardView.git"
version: "0.2.2" source: git
version: "0.2.3"
boolean_selector: boolean_selector:
dependency: transitive dependency: transitive
description: description:
@ -165,10 +166,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: characters name: characters
sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.2.1" version: "1.3.0"
charcode: charcode:
dependency: transitive dependency: transitive
description: description:
@ -229,10 +230,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: collection name: collection
sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.17.0" version: "1.17.2"
console: console:
dependency: transitive dependency: transitive
description: description:
@ -349,10 +350,42 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: file_picker name: file_picker
sha256: d090ae03df98b0247b82e5928f44d1b959867049d18d73635e2e0bc3f49542b9 sha256: "9d6e95ec73abbd31ec54d0e0df8a961017e165aba1395e462e5b31ea0c165daf"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.2.5" version: "5.3.1"
file_selector_linux:
dependency: transitive
description:
name: file_selector_linux
sha256: "045d372bf19b02aeb69cacf8b4009555fb5f6f0b7ad8016e5f46dd1387ddd492"
url: "https://pub.dev"
source: hosted
version: "0.9.2+1"
file_selector_macos:
dependency: transitive
description:
name: file_selector_macos
sha256: b15c3da8bd4908b9918111fa486903f5808e388b8d1c559949f584725a6594d6
url: "https://pub.dev"
source: hosted
version: "0.9.3+3"
file_selector_platform_interface:
dependency: transitive
description:
name: file_selector_platform_interface
sha256: "0aa47a725c346825a2bd396343ce63ac00bda6eff2fbc43eabe99737dede8262"
url: "https://pub.dev"
source: hosted
version: "2.6.1"
file_selector_windows:
dependency: transitive
description:
name: file_selector_windows
sha256: d3547240c20cabf205c7c7f01a50ecdbc413755814d6677f3cb366f04abcead0
url: "https://pub.dev"
source: hosted
version: "0.9.3+1"
fixnum: fixnum:
dependency: transitive dependency: transitive
description: description:
@ -378,10 +411,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: flutter_cache_manager name: flutter_cache_manager
sha256: "32cd900555219333326a2d0653aaaf8671264c29befa65bbd9856d204a4c9fb3" sha256: "8207f27539deb83732fdda03e259349046a39a4c767269285f449ade355d54ba"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.3.0" version: "3.3.1"
flutter_colorpicker: flutter_colorpicker:
dependency: "direct main" dependency: "direct main"
description: description:
@ -412,10 +445,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: flutter_plugin_android_lifecycle name: flutter_plugin_android_lifecycle
sha256: "4bef634684b2c7f3468c77c766c831229af829a0cd2d4ee6c1b99558bd14e5d2" sha256: f185ac890306b5779ecbd611f52502d8d4d63d27703ef73161ca0407e815f02c
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.8" version: "2.0.16"
flutter_redux: flutter_redux:
dependency: "direct main" dependency: "direct main"
description: description:
@ -428,18 +461,18 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: flutter_slidable name: flutter_slidable
sha256: "6c68e1fad129b4b807b2218ef4cf7f7f6f61c5ec8861c990dc2278d9d03cb09f" sha256: cc4231579e3eae41ae166660df717f4bad1359c87f4a4322ad8ba1befeb3d2be
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.0" version: "3.0.0"
flutter_staggered_grid_view: flutter_staggered_grid_view:
dependency: "direct main" dependency: "direct main"
description: description:
name: flutter_staggered_grid_view name: flutter_staggered_grid_view
sha256: "1312314293acceb65b92754298754801b0e1f26a1845833b740b30415bbbcf07" sha256: "19e7abb550c96fbfeb546b23f3ff356ee7c59a019a651f8f102a4ba9b7349395"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.6.2" version: "0.7.0"
flutter_styled_toast: flutter_styled_toast:
dependency: "direct main" dependency: "direct main"
description: description:
@ -503,14 +536,22 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.1" version: "2.1.1"
google_identity_services_web:
dependency: transitive
description:
name: google_identity_services_web
sha256: "554748f2478619076128152c58905620d10f9c7fc270ff1d3a9675f9f53838ed"
url: "https://pub.dev"
source: hosted
version: "0.2.1+1"
google_sign_in: google_sign_in:
dependency: "direct main" dependency: "direct main"
description: description:
name: google_sign_in name: google_sign_in
sha256: "821f354c053d51a2d417b02d42532a19a6ea8057d2f9ebb8863c07d81c98aaf9" sha256: f45038d27bcad37498f282295ae97eece23c9349fc16649154067b87b9f1fd03
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.4.4" version: "6.1.5"
google_sign_in_android: google_sign_in_android:
dependency: transitive dependency: transitive
description: description:
@ -531,18 +572,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: google_sign_in_platform_interface name: google_sign_in_platform_interface
sha256: fece762f0d2dd762ebde43ad70662a209ff6ee034111976549c392f7763d9264 sha256: "35ceee5f0eadc1c07b0b4af7553246e315c901facbb7d3dadf734ba2693ceec4"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.3.1" version: "2.4.2"
google_sign_in_web: google_sign_in_web:
dependency: transitive dependency: transitive
description: description:
name: google_sign_in_web name: google_sign_in_web
sha256: "75cc41ebc53b1756320ee14d9c3018ad3e6cea298147dbcd86e9d0c8d6720b40" sha256: "939e9172a378ec4eaeb7f71eeddac9b55ebd0e8546d336daec476a68e5279766"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.10.2+1" version: "0.12.0+5"
graphs: graphs:
dependency: transitive dependency: transitive
description: description:
@ -603,66 +644,90 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: image_cropper name: image_cropper
sha256: "85324928ee8a8be35a529446435ca53067865b9353c8681983472eeec66d780f" sha256: "542c3453109d16bcc388e43ae2276044d2cd6a6d20c68bdcff2c94ab9363ea15"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.1" version: "4.0.1"
image_cropper_for_web: image_cropper_for_web:
dependency: transitive dependency: transitive
description: description:
name: image_cropper_for_web name: image_cropper_for_web
sha256: "09e93a8ec0435adcaa23622ac090442872f18145d70b9ff605ffedcf97d56255" sha256: "89c936aa772a35b69ca67b78049ae9fa163a4fb8da2f6dee3893db8883fb49d2"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.3" version: "2.0.0"
image_cropper_platform_interface: image_cropper_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: image_cropper_platform_interface name: image_cropper_platform_interface
sha256: "62349e3aab63873ea9b9ab9f69d036ab8a0d74b3004beec4303981386cb9273f" sha256: b232175c132b2f7ede3e1f101652bcd635cb4079a77c6dded8e6d32e6578d685
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.3" version: "4.0.0"
image_picker: image_picker:
dependency: "direct main" dependency: "direct main"
description: description:
name: image_picker name: image_picker
sha256: "22207768556b82d55ec70166824350fee32298732d5efa4d6e756f848f51f66a" sha256: "7d7f2768df2a8b0a3cefa5ef4f84636121987d403130e70b17ef7e2cf650ba84"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.8.6+3" version: "1.0.4"
image_picker_android: image_picker_android:
dependency: transitive dependency: transitive
description: description:
name: image_picker_android name: image_picker_android
sha256: "68d067baf7f6e401b1124ee83dd6967e67847314250fd68012aab34a69beb344" sha256: "0c7b83bbe2980c8a8e36e974f055e11e51675784e13a4762889feed0f3937ff2"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.8.5+7" version: "0.8.8+1"
image_picker_for_web: image_picker_for_web:
dependency: transitive dependency: transitive
description: description:
name: image_picker_for_web name: image_picker_for_web
sha256: "66fc6e3877bbde82c33d122f3588777c3784ac5bd7d1cdd79213ef7aecb85b34" sha256: "50bc9ae6a77eea3a8b11af5eb6c661eeb858fdd2f734c2a4fd17086922347ef7"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.11" version: "3.0.1"
image_picker_ios: image_picker_ios:
dependency: transitive dependency: transitive
description: description:
name: image_picker_ios name: image_picker_ios
sha256: "39aa70b5f1e5e7c94585b9738632d5fdb764a5655e40cd9e7b95fbd2fc50c519" sha256: c5538cacefacac733c724be7484377923b476216ad1ead35a0d2eadcdc0fc497
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.8.6+9" version: "0.8.8+2"
image_picker_linux:
dependency: transitive
description:
name: image_picker_linux
sha256: "4ed1d9bb36f7cd60aa6e6cd479779cc56a4cb4e4de8f49d487b1aaad831300fa"
url: "https://pub.dev"
source: hosted
version: "0.2.1+1"
image_picker_macos:
dependency: transitive
description:
name: image_picker_macos
sha256: "3f5ad1e8112a9a6111c46d0b57a7be2286a9a07fc6e1976fdf5be2bd31d4ff62"
url: "https://pub.dev"
source: hosted
version: "0.2.1+1"
image_picker_platform_interface: image_picker_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: image_picker_platform_interface name: image_picker_platform_interface
sha256: "1991219d9dbc42a99aff77e663af8ca51ced592cd6685c9485e3458302d3d4f8" sha256: ed9b00e63977c93b0d2d2b343685bed9c324534ba5abafbb3dfbd6a780b1b514
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.6.3" version: "2.9.1"
image_picker_windows:
dependency: transitive
description:
name: image_picker_windows
sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb"
url: "https://pub.dev"
source: hosted
version: "0.2.1+1"
import_sorter: import_sorter:
dependency: "direct dev" dependency: "direct dev"
description: description:
@ -827,26 +892,26 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: matcher name: matcher
sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.12.13" version: "0.12.16"
material_color_utilities: material_color_utilities:
dependency: transitive dependency: transitive
description: description:
name: material_color_utilities name: material_color_utilities
sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.2.0" version: "0.5.0"
material_design_icons_flutter: material_design_icons_flutter:
dependency: "direct main" dependency: "direct main"
description: description:
name: material_design_icons_flutter name: material_design_icons_flutter
sha256: "8ef8562d16e747b2d93e5da5c2508931588939c5c00ebc8e2768e803db7dfd3c" sha256: "6f986b7a51f3ad4c00e33c5c84e8de1bdd140489bbcdc8b66fc1283dad4dea5a"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.0.7096" version: "7.0.7296"
memoize: memoize:
dependency: "direct main" dependency: "direct main"
description: description:
@ -859,10 +924,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: meta name: meta
sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.8.0" version: "1.9.1"
mime: mime:
dependency: transitive dependency: transitive
description: description:
@ -888,13 +953,13 @@ packages:
source: hosted source: hosted
version: "3.8.2" version: "3.8.2"
navigation_builder: navigation_builder:
dependency: transitive dependency: "direct overridden"
description: description:
name: navigation_builder name: navigation_builder
sha256: cbf966253e1f5b1798f3fbcae571fb6d452e5c7a606a5c451e2b9a3d343920f0 sha256: "95e25150191d9cd4e4b86504f33cd9e786d1e6732edb2e3e635bbedc5ef0dea7"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.0.2+4" version: "0.0.3"
node_preamble: node_preamble:
dependency: transitive dependency: transitive
description: description:
@ -963,10 +1028,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: path name: path
sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.8.2" version: "1.8.3"
path_parsing: path_parsing:
dependency: transitive dependency: transitive
description: description:
@ -979,10 +1044,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: path_provider name: path_provider
sha256: "04890b994ee89bfa80bf3080bfec40d5a92c5c7a785ebb02c13084a099d2b6f9" sha256: "3087813781ab814e4157b172f1a11c46be20179fcc9bea043e0fba36bc0acaa2"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.13" version: "2.0.15"
path_provider_android: path_provider_android:
dependency: transitive dependency: transitive
description: description:
@ -1019,58 +1084,58 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: path_provider_windows name: path_provider_windows
sha256: "642ddf65fde5404f83267e8459ddb4556316d3ee6d511ed193357e25caa3632d" sha256: "1cb68ba4cd3a795033de62ba1b7b4564dace301f952de6bfb3cd91b202b6ee96"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.4" version: "2.1.7"
pdf: pdf:
dependency: transitive dependency: transitive
description: description:
name: pdf name: pdf
sha256: "6cd57e8e6d052bd1078f18e0dc7cd6701fad6288231c1ce99d66ef5034d14e61" sha256: "586d3debf5432e5377044754032cfa53ab45e9abf371d4865e9ad5019570e246"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.9.0" version: "3.10.1"
pedantic:
dependency: transitive
description:
name: pedantic
sha256: "67fc27ed9639506c856c840ccce7594d0bdcd91bc8d53d6e52359449a1d50602"
url: "https://pub.dev"
source: hosted
version: "1.11.1"
permission_handler: permission_handler:
dependency: "direct main" dependency: "direct main"
description: description:
name: permission_handler name: permission_handler
sha256: e474a8b0de5a3ce6f0960599c0b24ab3441a200a8705f4131e7bb926027100db sha256: "284a66179cabdf942f838543e10413246f06424d960c92ba95c84439154fcac8"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "9.1.0" version: "11.0.1"
permission_handler_android: permission_handler_android:
dependency: transitive dependency: transitive
description: description:
name: permission_handler_android name: permission_handler_android
sha256: a512e0fa8abcb0659d938ec2df93a70eb1df1fdea5fdc6d79a866bfd858a28fc sha256: ace7d15a3d1a4a0b91c041d01e5405df221edb9de9116525efc773c74e6fc790
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "9.0.2+1" version: "11.0.5"
permission_handler_apple: permission_handler_apple:
dependency: transitive dependency: transitive
description: description:
name: permission_handler_apple name: permission_handler_apple
sha256: "9c370ef6a18b1c4b2f7f35944d644a56aa23576f23abee654cf73968de93f163" sha256: "99e220bce3f8877c78e4ace901082fb29fa1b4ebde529ad0932d8d664b34f3f5"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "9.0.7" version: "9.1.4"
permission_handler_platform_interface: permission_handler_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: permission_handler_platform_interface name: permission_handler_platform_interface
sha256: "68abbc472002b5e6dfce47fe9898c6b7d8328d58b5d2524f75e277c07a97eb84" sha256: f2343e9fa9c22ae4fd92d4732755bfe452214e7189afcc097380950cf567b4b2
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.9.0" version: "3.11.5"
permission_handler_windows:
dependency: transitive
description:
name: permission_handler_windows
sha256: cc074aace208760f1eee6aa4fae766b45d947df85bc831cde77009cdb4720098
url: "https://pub.dev"
source: hosted
version: "0.1.3"
petitparser: petitparser:
dependency: transitive dependency: transitive
description: description:
@ -1091,10 +1156,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: pinput name: pinput
sha256: "1773743c188cdd2f8d0398ea708ec72645bb41ac9311755c4f7bb03a4184bdcf" sha256: a92b55ecf9c25d1b9e100af45905385d5bc34fc9b6b04177a9e82cb88fe4d805
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.2.31" version: "3.0.1"
platform: platform:
dependency: transitive dependency: transitive
description: description:
@ -1131,10 +1196,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: printing name: printing
sha256: fe654363cd0114b50a0815b24e96957c7e9a60eb4e3b7ccfe71cf3f2b7114cb2 sha256: e7c383dca95ee7b88c02dc1c66638628d3dcdc2fb2cc47e7a595facd47e46b56
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.10.1" version: "5.11.0"
process: process:
dependency: transitive dependency: transitive
description: description:
@ -1228,34 +1293,34 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: sentry name: sentry
sha256: "81c1f32496ff04476d6ddfe5894215b1034d185301d2e3dffd272853392c5ea7" sha256: "830667eadc0398fea3a3424ed1b74568e2db603a42758d0922e2f2974ce55a60"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.20.1" version: "7.10.1"
sentry_flutter: sentry_flutter:
dependency: "direct main" dependency: "direct main"
description: description:
name: sentry_flutter name: sentry_flutter
sha256: "5ca2c8d86c220f7ad3109bedceb2c51b0e90bac5218e732be98ea2cba8006461" sha256: "6730f41b304c6fb0fa590dacccaf73ba11082fc64b274cfe8a79776f2b95309c"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.20.1" version: "7.10.1"
share_plus: share_plus:
dependency: "direct main" dependency: "direct main"
description: description:
name: share_plus name: share_plus
sha256: "8c6892037b1824e2d7e8f59d54b3105932899008642e6372e5079c6939b4b625" sha256: "6cec740fa0943a826951223e76218df002804adb588235a8910dc3d6b0654e11"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.3.1" version: "7.1.0"
share_plus_platform_interface: share_plus_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: share_plus_platform_interface name: share_plus_platform_interface
sha256: "82ddd4ab9260c295e6e39612d4ff00390b9a7a21f1bb1da771e2f232d80ab8a1" sha256: "357412af4178d8e11d14f41723f80f12caea54cf0d5cd29af9dcdab85d58aea7"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.2.0" version: "3.3.0"
shared_preferences: shared_preferences:
dependency: "direct main" dependency: "direct main"
description: description:
@ -1348,10 +1413,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: sign_in_with_apple name: sign_in_with_apple
sha256: ac3b113767dfdd765078c507dad9d4d9fe96b669cc7bd88fc36fc15376fb3400 sha256: "0975c23b9f8b30a80e27d5659a75993a093d4cb5f4eb7d23a9ccc586fea634e0"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.3.0" version: "5.0.0"
sign_in_with_apple_platform_interface: sign_in_with_apple_platform_interface:
dependency: transitive dependency: transitive
description: description:
@ -1377,10 +1442,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: smart_auth name: smart_auth
sha256: "8cfaec55b77d5930ed1666bb7ae70db5bade099bb1422401386853b400962113" sha256: a25229b38c02f733d0a4e98d941b42bed91a976cb589e934895e60ccfa674cf6
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.8" version: "1.1.1"
source_gen: source_gen:
dependency: transitive dependency: transitive
description: description:
@ -1409,10 +1474,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: source_span name: source_span
sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.9.1" version: "1.10.0"
sqflite: sqflite:
dependency: transitive dependency: transitive
description: description:
@ -1441,10 +1506,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: states_rebuilder name: states_rebuilder
sha256: e8612993e97a5caeb9d983f6081304ef10868ba436ae49a723ee089ab51e2d12 sha256: bf1a5ab5c543acdefce35e60f482eb7ab592339484fe3266d147ee597f18dc92
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.2.0" version: "6.3.0"
stream_channel: stream_channel:
dependency: transitive dependency: transitive
description: description:
@ -1521,26 +1586,26 @@ packages:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: test name: test
sha256: a5fcd2d25eeadbb6589e80198a47d6a464ba3e2049da473943b8af9797900c2d sha256: "13b41f318e2a5751c3169137103b60c584297353d4b1761b66029bae6411fe46"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.22.0" version: "1.24.3"
test_api: test_api:
dependency: transitive dependency: transitive
description: description:
name: test_api name: test_api
sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.4.16" version: "0.6.0"
test_core: test_core:
dependency: transitive dependency: transitive
description: description:
name: test_core name: test_core
sha256: "0ef9755ec6d746951ba0aabe62f874b707690b5ede0fecc818b138fcc9b14888" sha256: "99806e9e6d95c7b059b7a0fc08f07fc53fabe54a829497f0d9676299f1e8637e"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.4.20" version: "0.5.3"
timeago: timeago:
dependency: "direct main" dependency: "direct main"
description: description:
@ -1609,10 +1674,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_linux name: url_launcher_linux
sha256: e29039160ab3730e42f3d811dc2a6d5f2864b90a70fb765ea60144b03307f682 sha256: b651aad005e0cb06a01dbd84b428a301916dc75f0e7ea6165f80057fee2d8e8e
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.3" version: "3.0.6"
url_launcher_macos: url_launcher_macos:
dependency: transitive dependency: transitive
description: description:
@ -1633,18 +1698,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_web name: url_launcher_web
sha256: "574cfbe2390666003c3a1d129bdc4574aaa6728f0c00a4829a81c316de69dd9b" sha256: "2942294a500b4fa0b918685aff406773ba0a4cd34b7f42198742a94083020ce5"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.15" version: "2.0.20"
url_launcher_windows: url_launcher_windows:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_windows name: url_launcher_windows
sha256: "97c9067950a0d09cbd93e2e3f0383d1403989362b97102fbf446473a48079a4b" sha256: "95fef3129dc7cfaba2bc3d5ba2e16063bb561fc6d78e63eee16162bc70029069"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.4" version: "3.0.8"
uuid: uuid:
dependency: transitive dependency: transitive
description: description:
@ -1681,10 +1746,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: vm_service name: vm_service
sha256: e7fb6c2282f7631712b69c19d1bff82f3767eea33a2321c14fa59ad67ea391c7 sha256: c620a6f783fa22436da68e42db7ebbf18b8c44b9a46ab911f666ff09ffd9153f
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "9.4.0" version: "11.7.1"
vs_scrollbar:
dependency: transitive
description:
name: vs_scrollbar
sha256: "6a2df5e2597064e8dbb8fc3679065d8e748d711fa979f045328c98b7100b1665"
url: "https://pub.dev"
source: hosted
version: "1.0.0"
watcher: watcher:
dependency: transitive dependency: transitive
description: description:
@ -1693,6 +1766,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.2" version: "1.0.2"
web:
dependency: transitive
description:
name: web
sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10
url: "https://pub.dev"
source: hosted
version: "0.1.4-beta"
web_socket_channel: web_socket_channel:
dependency: transitive dependency: transitive
description: description:
@ -1705,10 +1786,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: webdriver name: webdriver
sha256: ef67178f0cc7e32c1494645b11639dd1335f1d18814aa8435113a92e9ef9d841 sha256: "3c923e918918feeb90c4c9fdf1fe39220fa4c0e8e2c0fffaded174498ef86c49"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.1" version: "3.0.2"
webkit_inspection_protocol: webkit_inspection_protocol:
dependency: transitive dependency: transitive
description: description:
@ -1721,34 +1802,34 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: webview_flutter name: webview_flutter
sha256: "392c1d83b70fe2495de3ea2c84531268d5b8de2de3f01086a53334d8b6030a88" sha256: c1ab9b81090705c6069197d9fdc1625e587b52b8d70cdde2339d177ad0dbb98e
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.4" version: "4.4.1"
webview_flutter_android: webview_flutter_android:
dependency: transitive dependency: transitive
description: description:
name: webview_flutter_android name: webview_flutter_android
sha256: "8b3b2450e98876c70bfcead876d9390573b34b9418c19e28168b74f6cb252dbd" sha256: b0cd33dd7d3dd8e5f664e11a19e17ba12c352647269921a3b568406b001f1dff
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.10.4" version: "3.12.0"
webview_flutter_platform_interface: webview_flutter_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: webview_flutter_platform_interface name: webview_flutter_platform_interface
sha256: "812165e4e34ca677bdfbfa58c01e33b27fd03ab5fa75b70832d4b7d4ca1fa8cf" sha256: "6d9213c65f1060116757a7c473247c60f3f7f332cac33dc417c9e362a9a13e4f"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.9.5" version: "2.6.0"
webview_flutter_wkwebview: webview_flutter_wkwebview:
dependency: transitive dependency: transitive
description: description:
name: webview_flutter_wkwebview name: webview_flutter_wkwebview
sha256: a5364369c758892aa487cbf59ea41d9edd10f9d9baf06a94e80f1bd1b4c7bbc0 sha256: "30b9af6bdd457b44c08748b9190d23208b5165357cc2eb57914fee1366c42974"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.9.5" version: "3.9.1"
widget_kit_plugin: widget_kit_plugin:
dependency: "direct main" dependency: "direct main"
description: description:
@ -1761,10 +1842,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: win32 name: win32
sha256: c9ebe7ee4ab0c2194e65d3a07d8c54c5d00bb001b76081c4a04cdb8448b59e46 sha256: "5a751eddf9db89b3e5f9d50c20ab8612296e4e8db69009788d6c8b060a84191c"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.1.3" version: "4.1.4"
window_manager: window_manager:
dependency: "direct main" dependency: "direct main"
description: description:
@ -1798,5 +1879,5 @@ packages:
source: hosted source: hosted
version: "3.1.1" version: "3.1.1"
sdks: sdks:
dart: ">=2.19.0 <3.0.0" dart: ">=3.1.0 <4.0.0"
flutter: ">=3.7.0" flutter: ">=3.13.0"

View File

@ -6,7 +6,7 @@ documentation: https://invoiceninja.github.io
publish_to: none publish_to: none
environment: environment:
sdk: '>=2.12.0 <3.0.0' sdk: '>=3.1.0 <4.0.0'
flutter_icons: flutter_icons:
android: true android: true
@ -21,10 +21,10 @@ dependencies:
flutter_localizations: flutter_localizations:
sdk: flutter sdk: flutter
#google_sign_in: ^6.0.1 #google_sign_in: ^6.0.1
google_sign_in: 5.4.4 google_sign_in: ^6.1.5
in_app_review: ^2.0.4 in_app_review: ^2.0.4
in_app_purchase: ^3.1.1 in_app_purchase: ^3.1.1
pinput: ^2.2.11 pinput: ^3.0.1
#pinput: ^2.2.23 #pinput: ^2.2.23
#pinput: #pinput:
# git: # git:
@ -35,26 +35,26 @@ dependencies:
http: ^0.13.3 http: ^0.13.3
path_provider: ^2.0.2 path_provider: ^2.0.2
shared_preferences: ^2.0.6 shared_preferences: ^2.0.6
material_design_icons_flutter: ^6.0.7096 material_design_icons_flutter: ^7.0.7296
built_value: ^8.1.2 built_value: ^8.1.2
built_collection: ^5.1.0 built_collection: ^5.1.0
memoize: ^3.0.0 memoize: ^3.0.0
cached_network_image: 3.0.0 # imageRenderMethodForWeb: ImageRenderMethodForWeb.HttpGet, cached_network_image: 3.0.0 # imageRenderMethodForWeb: ImageRenderMethodForWeb.HttpGet,
url_launcher: ^6.0.20 url_launcher: ^6.0.20
share_plus: ^6.3.1 share_plus: ^7.1.0
intl: ^0.17.0 intl: 0.17.0
flutter_slidable: ^2.0.0 flutter_slidable: ^3.0.0
charts_flutter: ^0.12.0 charts_flutter: ^0.12.0
#qr_flutter: ^4.0.0 #qr_flutter: ^4.0.0
qr_flutter: # https://github.com/theyakka/qr.flutter/issues/174#issuecomment-1084235757 qr_flutter: # https://github.com/theyakka/qr.flutter/issues/174#issuecomment-1084235757
git: git:
url: https://github.com/theyakka/qr.flutter.git url: https://github.com/theyakka/qr.flutter.git
local_auth: ^2.1.5 local_auth: ^2.1.5
sentry_flutter: ^6.20.1 sentry_flutter: ^7.10.1
image_picker: ^0.8.6+3 image_picker: ^1.0.4
flutter_colorpicker: ^1.0.3 flutter_colorpicker: ^1.0.3
flutter_json_viewer: ^1.0.1 flutter_json_viewer: ^1.0.1
webview_flutter: ^3.0.4 webview_flutter: ^4.4.1
timeago: ^3.1.0 timeago: ^3.1.0
package_info: ^2.0.2 package_info: ^2.0.2
rounded_loading_button: ^2.1.0 rounded_loading_button: ^2.1.0
@ -62,9 +62,12 @@ dependencies:
# flutter_launcher_icons: ^0.9.1 # flutter_launcher_icons: ^0.9.1
overflow_view: ^0.3.1 overflow_view: ^0.3.1
flutter_styled_toast: ^2.0.0 flutter_styled_toast: ^2.0.0
permission_handler: 9.1.0 # Disables Windows support to fix crash permission_handler: ^11.0.1 # Disables Windows support to fix crash
file_picker: ^5.2.5 file_picker: ^5.2.5
boardview: ^0.2.2 #boardview: ^0.2.2
boardview:
git:
url: https://github.com/BenPoell/FlutterBoardView.git
pointer_interceptor: ^0.9.0 pointer_interceptor: ^0.9.0
contacts_service: ^0.6.3 contacts_service: ^0.6.3
diacritic: ^0.1.3 diacritic: ^0.1.3
@ -77,14 +80,14 @@ dependencies:
# url: https://github.com/superlistapp/super_editor.git # url: https://github.com/superlistapp/super_editor.git
# path: super_editor # path: super_editor
html2md: ^1.2.6 html2md: ^1.2.6
printing: ^5.10.1 printing: ^5.11.0
image_cropper: ^3.0.1 image_cropper: ^4.0.1
msal_js: ^2.14.0 msal_js: ^2.14.0
sign_in_with_apple: ^4.3.0 sign_in_with_apple: ^5.0.0
window_manager: ^0.3.0 window_manager: ^0.3.0
# bitsdojo_window: ^0.1.5 # bitsdojo_window: ^0.1.5
intl_phone_field: ^3.1.0 intl_phone_field: ^3.1.0
flutter_staggered_grid_view: ^0.6.2 flutter_staggered_grid_view: ^0.7.0
desktop_drop: ^0.4.1 desktop_drop: ^0.4.1
widget_kit_plugin: ^0.1.1 widget_kit_plugin: ^0.1.1
pinch_zoom: ^1.0.0 pinch_zoom: ^1.0.0
@ -92,6 +95,11 @@ dependencies:
# idb_shim: ^1.11.1+1 # idb_shim: ^1.11.1+1
collection: ^1.15.0-nullsafety.4 collection: ^1.15.0-nullsafety.4
dependency_overrides:
intl: any
navigation_builder: ^0.0.3
states_rebuilder: ^6.3.0
dev_dependencies: dev_dependencies:
flutter_driver: flutter_driver:
sdk: flutter sdk: flutter

View File

@ -1,8 +1,5 @@
// Import Flutter Driver API // Import Flutter Driver API
// Dart imports:
import 'dart:async';
// Package imports: // Package imports:
import 'package:flutter_driver/flutter_driver.dart'; import 'package:flutter_driver/flutter_driver.dart';
import 'package:test/test.dart'; import 'package:test/test.dart';
@ -15,7 +12,7 @@ void main() {
group('LOGIN TEST', () { group('LOGIN TEST', () {
late TestLocalization localization; late TestLocalization localization;
FlutterDriver? driver; FlutterDriver? driver;
StreamSubscription? streamSubscription; //StreamSubscription? streamSubscription;
setUpAll(() async { setUpAll(() async {
localization = TestLocalization('en'); localization = TestLocalization('en');
@ -35,9 +32,12 @@ void main() {
if (driver != null) { if (driver != null) {
driver!.close(); driver!.close();
} }
/*
if (streamSubscription != null) { if (streamSubscription != null) {
streamSubscription.cancel(); streamSubscription.cancel();
} }
*/
}); });
group('SELF-HOSTED', () { group('SELF-HOSTED', () {

View File

@ -8,10 +8,9 @@ set(BINARY_NAME "invoiceninja")
# Explicitly opt in to modern CMake behaviors to avoid warnings with recent # Explicitly opt in to modern CMake behaviors to avoid warnings with recent
# versions of CMake. # versions of CMake.
cmake_policy(SET CMP0063 NEW)
set(PDFIUM_VERSION "latest" CACHE STRING "" FORCE) set(PDFIUM_VERSION "latest" CACHE STRING "" FORCE)
set(PDFIUM_ARCH "x64" CACHE STRING "" FORCE) set(PDFIUM_ARCH "x64" CACHE STRING "" FORCE)
cmake_policy(VERSION 3.14...3.25)
# Define build configuration option. # Define build configuration option.
get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
@ -55,6 +54,7 @@ add_subdirectory(${FLUTTER_MANAGED_DIR})
# Application build; see runner/CMakeLists.txt. # Application build; see runner/CMakeLists.txt.
add_subdirectory("runner") add_subdirectory("runner")
# Generated plugin build rules, which manage building the plugins and adding # Generated plugin build rules, which manage building the plugins and adding
# them to the application. # them to the application.
include(flutter/generated_plugins.cmake) include(flutter/generated_plugins.cmake)

View File

@ -7,7 +7,9 @@
#include "generated_plugin_registrant.h" #include "generated_plugin_registrant.h"
#include <desktop_drop/desktop_drop_plugin.h> #include <desktop_drop/desktop_drop_plugin.h>
#include <file_selector_windows/file_selector_windows.h>
#include <local_auth_windows/local_auth_plugin.h> #include <local_auth_windows/local_auth_plugin.h>
#include <permission_handler_windows/permission_handler_windows_plugin.h>
#include <printing/printing_plugin.h> #include <printing/printing_plugin.h>
#include <screen_retriever/screen_retriever_plugin.h> #include <screen_retriever/screen_retriever_plugin.h>
#include <sentry_flutter/sentry_flutter_plugin.h> #include <sentry_flutter/sentry_flutter_plugin.h>
@ -19,8 +21,12 @@
void RegisterPlugins(flutter::PluginRegistry* registry) { void RegisterPlugins(flutter::PluginRegistry* registry) {
DesktopDropPluginRegisterWithRegistrar( DesktopDropPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("DesktopDropPlugin")); registry->GetRegistrarForPlugin("DesktopDropPlugin"));
FileSelectorWindowsRegisterWithRegistrar(
registry->GetRegistrarForPlugin("FileSelectorWindows"));
LocalAuthPluginRegisterWithRegistrar( LocalAuthPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("LocalAuthPlugin")); registry->GetRegistrarForPlugin("LocalAuthPlugin"));
PermissionHandlerWindowsPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin"));
PrintingPluginRegisterWithRegistrar( PrintingPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("PrintingPlugin")); registry->GetRegistrarForPlugin("PrintingPlugin"));
ScreenRetrieverPluginRegisterWithRegistrar( ScreenRetrieverPluginRegisterWithRegistrar(

View File

@ -4,7 +4,9 @@
list(APPEND FLUTTER_PLUGIN_LIST list(APPEND FLUTTER_PLUGIN_LIST
desktop_drop desktop_drop
file_selector_windows
local_auth_windows local_auth_windows
permission_handler_windows
printing printing
screen_retriever screen_retriever
sentry_flutter sentry_flutter

View File

@ -31,6 +31,11 @@ bool FlutterWindow::OnCreate() {
this->Show(); this->Show();
}); });
// Flutter can complete the first frame before the "show window" callback is
// registered. The following call ensures a frame is pending to ensure the
// window is shown. It is a no-op if the first frame hasn't completed yet.
flutter_controller_->ForceRedraw();
return true; return true;
} }

View File

@ -47,16 +47,17 @@ std::string Utf8FromUtf16(const wchar_t* utf16_string) {
} }
int target_length = ::WideCharToMultiByte( int target_length = ::WideCharToMultiByte(
CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string,
-1, nullptr, 0, nullptr, nullptr); -1, nullptr, 0, nullptr, nullptr)
-1; // remove the trailing null character
int input_length = (int)wcslen(utf16_string);
std::string utf8_string; std::string utf8_string;
if (target_length == 0 || target_length > utf8_string.max_size()) { if (target_length <= 0 || target_length > utf8_string.max_size()) {
return utf8_string; return utf8_string;
} }
utf8_string.resize(target_length); utf8_string.resize(target_length);
int converted_length = ::WideCharToMultiByte( int converted_length = ::WideCharToMultiByte(
CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string,
-1, utf8_string.data(), input_length, utf8_string.data(), target_length, nullptr, nullptr);
target_length, nullptr, nullptr);
if (converted_length == 0) { if (converted_length == 0) {
return std::string(); return std::string();
} }

View File

@ -60,7 +60,7 @@ class WindowClassRegistrar {
public: public:
~WindowClassRegistrar() = default; ~WindowClassRegistrar() = default;
// Returns the singleton registar instance. // Returns the singleton registrar instance.
static WindowClassRegistrar* GetInstance() { static WindowClassRegistrar* GetInstance() {
if (!instance_) { if (!instance_) {
instance_ = new WindowClassRegistrar(); instance_ = new WindowClassRegistrar();

View File

@ -77,7 +77,7 @@ class Win32Window {
// OS callback called by message pump. Handles the WM_NCCREATE message which // OS callback called by message pump. Handles the WM_NCCREATE message which
// is passed when the non-client area is being created and enables automatic // is passed when the non-client area is being created and enables automatic
// non-client DPI scaling so that the non-client area automatically // non-client DPI scaling so that the non-client area automatically
// responsponds to changes in DPI. All other messages are handled by // responds to changes in DPI. All other messages are handled by
// MessageHandler. // MessageHandler.
static LRESULT CALLBACK WndProc(HWND const window, static LRESULT CALLBACK WndProc(HWND const window,
UINT const message, UINT const message,