diff --git a/lib/ui/app/debug/state_inspector.dart b/lib/ui/app/debug/state_inspector.dart index 1363c3b5a..e0db557ba 100644 --- a/lib/ui/app/debug/state_inspector.dart +++ b/lib/ui/app/debug/state_inspector.dart @@ -4,6 +4,7 @@ import 'package:invoiceninja_flutter/data/models/serializers.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:flutter_json_widget/flutter_json_widget.dart'; import 'package:invoiceninja_flutter/ui/app/responsive_padding.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; class StateInspector extends StatefulWidget { @@ -48,8 +49,7 @@ class _StateInspectorState extends State { padding: const EdgeInsets.all(15), child: Material( child: ResponsivePadding( - child: ListView( - shrinkWrap: true, + child: ScrollableListView( children: [ TextFormField( autofocus: true, diff --git a/lib/ui/app/document_grid.dart b/lib/ui/app/document_grid.dart index 6203d3853..f1c5823ca 100644 --- a/lib/ui/app/document_grid.dart +++ b/lib/ui/app/document_grid.dart @@ -12,6 +12,7 @@ import 'package:invoiceninja_flutter/data/web_client.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/ui/app/buttons/elevated_button.dart'; import 'package:invoiceninja_flutter/ui/app/lists/list_divider.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/utils/dialogs.dart'; import 'package:invoiceninja_flutter/utils/files.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; @@ -40,8 +41,7 @@ class DocumentGrid extends StatelessWidget { final localization = AppLocalization.of(context); final state = StoreProvider.of(context).state; - return ListView( - shrinkWrap: true, + return ScrollableListView( children: [ if (state.isEnterprisePlan) Padding( diff --git a/lib/ui/app/forms/app_form.dart b/lib/ui/app/forms/app_form.dart index 864414683..17930ca3b 100644 --- a/lib/ui/app/forms/app_form.dart +++ b/lib/ui/app/forms/app_form.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_redux/flutter_redux.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; class AppForm extends StatelessWidget { const AppForm({ @@ -22,8 +23,7 @@ class AppForm extends StatelessWidget { child: Form( key: formKey, child: child ?? - ListView( - shrinkWrap: true, + ScrollableListView( children: children, ), ), diff --git a/lib/ui/app/scrollable_listview.dart b/lib/ui/app/scrollable_listview.dart index 0ae3097ea..7a18e1f8c 100644 --- a/lib/ui/app/scrollable_listview.dart +++ b/lib/ui/app/scrollable_listview.dart @@ -1,8 +1,16 @@ import 'package:flutter/material.dart'; class ScrollableListView extends StatefulWidget { - const ScrollableListView({this.children}); + const ScrollableListView({ + Key key, + @required this.children, + this.scrollController, + this.padding, + }) : super(key: key); + final List children; + final ScrollController scrollController; + final EdgeInsetsGeometry padding; @override _ScrollableListViewState createState() => _ScrollableListViewState(); @@ -31,11 +39,12 @@ class _ScrollableListViewState extends State { onExit: (event) => setState(() => _isHovered = false), child: Scrollbar( child: ListView( + padding: widget.padding, children: widget.children, - controller: _scrollController, + controller: widget.scrollController ?? _scrollController, shrinkWrap: true, ), - controller: _scrollController, + controller: widget.scrollController ?? _scrollController, isAlwaysShown: _isHovered, ), ); diff --git a/lib/ui/app/system_log_viewer.dart b/lib/ui/app/system_log_viewer.dart index 4c9a3dcdf..0802184fd 100644 --- a/lib/ui/app/system_log_viewer.dart +++ b/lib/ui/app/system_log_viewer.dart @@ -6,6 +6,7 @@ import 'package:flutter_json_widget/flutter_json_widget.dart'; import 'package:flutter_redux/flutter_redux.dart'; import 'package:invoiceninja_flutter/data/models/system_log_model.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; @@ -25,8 +26,7 @@ class _SystemLogViewerState extends State { final localization = AppLocalization.of(context); final state = StoreProvider.of(context).state; - return ListView( - shrinkWrap: true, + return ScrollableListView( children: [ ExpansionPanelList( expansionCallback: (int index, bool isExpanded) { diff --git a/lib/ui/auth/login_view.dart b/lib/ui/auth/login_view.dart index fbb89acbb..04b43e43c 100644 --- a/lib/ui/auth/login_view.dart +++ b/lib/ui/auth/login_view.dart @@ -12,6 +12,7 @@ import 'package:invoiceninja_flutter/ui/app/forms/app_toggle_buttons.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; import 'package:invoiceninja_flutter/ui/app/forms/password_field.dart'; import 'package:invoiceninja_flutter/ui/app/link_text.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/auth/login_vm.dart'; import 'package:invoiceninja_flutter/utils/colors.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; @@ -280,8 +281,7 @@ class _LoginState extends State { ), ), ), - ListView( - shrinkWrap: true, + ScrollableListView( children: [ Padding( padding: EdgeInsets.only(top: 20.0, bottom: 20.0), diff --git a/lib/ui/client/edit/client_edit_billing_address.dart b/lib/ui/client/edit/client_edit_billing_address.dart index 35f051705..5a0fa138d 100644 --- a/lib/ui/client/edit/client_edit_billing_address.dart +++ b/lib/ui/client/edit/client_edit_billing_address.dart @@ -4,6 +4,7 @@ import 'package:invoiceninja_flutter/ui/app/buttons/elevated_button.dart'; import 'package:invoiceninja_flutter/ui/app/entity_dropdown.dart'; import 'package:invoiceninja_flutter/ui/app/form_card.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/client/edit/client_edit_vm.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; @@ -88,7 +89,7 @@ class ClientEditBillingAddressState extends State { final viewModel = widget.viewModel; final client = viewModel.client; - return ListView(shrinkWrap: true, children: [ + return ScrollableListView(children: [ FormCard( children: [ DecoratedFormField( diff --git a/lib/ui/client/edit/client_edit_contacts.dart b/lib/ui/client/edit/client_edit_contacts.dart index 733573ec0..23ca474ba 100644 --- a/lib/ui/client/edit/client_edit_contacts.dart +++ b/lib/ui/client/edit/client_edit_contacts.dart @@ -9,6 +9,7 @@ import 'package:invoiceninja_flutter/ui/app/form_card.dart'; import 'package:invoiceninja_flutter/ui/app/forms/custom_field.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; import 'package:invoiceninja_flutter/ui/app/responsive_padding.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/client/edit/client_edit_contacts_vm.dart'; import 'package:invoiceninja_flutter/ui/client/edit/client_edit_vm.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; @@ -92,7 +93,7 @@ class _ClientEditContactsState extends State { }); } - return ListView( + return ScrollableListView( children: [] ..addAll(contacts) ..add(Padding( diff --git a/lib/ui/client/edit/client_edit_details.dart b/lib/ui/client/edit/client_edit_details.dart index c1a348718..3ce3b29e9 100644 --- a/lib/ui/client/edit/client_edit_details.dart +++ b/lib/ui/client/edit/client_edit_details.dart @@ -9,6 +9,7 @@ import 'package:invoiceninja_flutter/ui/app/forms/custom_field.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; import 'package:invoiceninja_flutter/ui/app/forms/dynamic_selector.dart'; import 'package:invoiceninja_flutter/ui/app/forms/user_picker.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/client/edit/client_edit_vm.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/contacts.dart'; @@ -125,8 +126,7 @@ class ClientEditDetailsState extends State { final state = viewModel.state; final client = viewModel.client; - return ListView( - shrinkWrap: true, + return ScrollableListView( children: [ FormCard( children: [ diff --git a/lib/ui/client/edit/client_edit_notes.dart b/lib/ui/client/edit/client_edit_notes.dart index 3f3a7e97d..06bb6337d 100644 --- a/lib/ui/client/edit/client_edit_notes.dart +++ b/lib/ui/client/edit/client_edit_notes.dart @@ -4,6 +4,7 @@ import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/ui/app/entity_dropdown.dart'; import 'package:invoiceninja_flutter/ui/app/forms/app_dropdown_button.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/client/edit/client_edit_vm.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; @@ -78,8 +79,7 @@ class ClientEditNotesState extends State { final state = viewModel.state; final client = viewModel.client; - return ListView( - shrinkWrap: true, + return ScrollableListView( children: [ FormCard( children: [ diff --git a/lib/ui/client/edit/client_edit_settings.dart b/lib/ui/client/edit/client_edit_settings.dart index 1308ab3ea..67d6a0fdc 100644 --- a/lib/ui/client/edit/client_edit_settings.dart +++ b/lib/ui/client/edit/client_edit_settings.dart @@ -4,6 +4,7 @@ import 'package:invoiceninja_flutter/redux/payment_term/payment_term_selectors.d import 'package:invoiceninja_flutter/ui/app/entity_dropdown.dart'; import 'package:invoiceninja_flutter/ui/app/forms/app_dropdown_button.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/client/edit/client_edit_vm.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; @@ -83,8 +84,7 @@ class ClientEditSettingsState extends State { final state = viewModel.state; final client = viewModel.client; - return ListView( - shrinkWrap: true, + return ScrollableListView( children: [ FormCard( children: [ diff --git a/lib/ui/client/edit/client_edit_shipping_address.dart b/lib/ui/client/edit/client_edit_shipping_address.dart index 55c18b37c..2a7061e33 100644 --- a/lib/ui/client/edit/client_edit_shipping_address.dart +++ b/lib/ui/client/edit/client_edit_shipping_address.dart @@ -3,6 +3,7 @@ import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/ui/app/buttons/elevated_button.dart'; import 'package:invoiceninja_flutter/ui/app/entity_dropdown.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/client/edit/client_edit_vm.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; @@ -89,7 +90,7 @@ class ClientEditShippingAddressState extends State { final viewModel = widget.viewModel; final client = viewModel.client; - return ListView(shrinkWrap: true, children: [ + return ScrollableListView(children: [ FormCard( children: [ DecoratedFormField( diff --git a/lib/ui/client/view/client_view_details.dart b/lib/ui/client/view/client_view_details.dart index a433d6cbc..a979f135e 100644 --- a/lib/ui/client/view/client_view_details.dart +++ b/lib/ui/client/view/client_view_details.dart @@ -6,6 +6,7 @@ import 'package:flutter_styled_toast/flutter_styled_toast.dart'; import 'package:invoiceninja_flutter/constants.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/ui/app/lists/app_list_tile.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/utils/platforms.dart'; @@ -200,7 +201,7 @@ class _ClientViewDetailsState extends State { return listTiles; } - return ListView( + return ScrollableListView( children: _buildDetailsList(), ); } diff --git a/lib/ui/client/view/client_view_ledger.dart b/lib/ui/client/view/client_view_ledger.dart index 121178d9b..1f70f3b65 100644 --- a/lib/ui/client/view/client_view_ledger.dart +++ b/lib/ui/client/view/client_view_ledger.dart @@ -41,7 +41,7 @@ class _ClientViewLedgerState extends State { } return ListView.separated( - shrinkWrap: true, + shrinkWrap: true, padding: const EdgeInsets.symmetric(vertical: 16), itemCount: ledgers.length + 1, separatorBuilder: (context, index) => ListDivider(), diff --git a/lib/ui/client/view/client_view_overview.dart b/lib/ui/client/view/client_view_overview.dart index dfb8cb93b..851c15084 100644 --- a/lib/ui/client/view/client_view_overview.dart +++ b/lib/ui/client/view/client_view_overview.dart @@ -18,6 +18,7 @@ import 'package:invoiceninja_flutter/ui/app/entity_header.dart'; import 'package:invoiceninja_flutter/ui/app/gateways/token_meta.dart'; import 'package:invoiceninja_flutter/ui/app/icon_message.dart'; import 'package:invoiceninja_flutter/ui/app/lists/list_divider.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/client/view/client_view_vm.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:invoiceninja_flutter/utils/extensions.dart'; @@ -108,7 +109,7 @@ class ClientOverview extends StatelessWidget { value: client.customValue4); } - return ListView( + return ScrollableListView( children: [ EntityHeader( entity: client, diff --git a/lib/ui/company_gateway/edit/company_gateway_edit.dart b/lib/ui/company_gateway/edit/company_gateway_edit.dart index 2006ad714..d296902ff 100644 --- a/lib/ui/company_gateway/edit/company_gateway_edit.dart +++ b/lib/ui/company_gateway/edit/company_gateway_edit.dart @@ -12,6 +12,7 @@ import 'package:invoiceninja_flutter/ui/app/forms/app_form.dart'; import 'package:invoiceninja_flutter/ui/app/forms/color_picker.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; import 'package:invoiceninja_flutter/ui/app/invoice/tax_rate_dropdown.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/company_gateway/edit/company_gateway_edit_vm.dart'; import 'package:invoiceninja_flutter/ui/app/edit_scaffold.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; @@ -101,7 +102,7 @@ class _CompanyGatewayEditState extends State focusNode: _focusNode, tabController: _controller, children: [ - ListView( + ScrollableListView( children: [ FormCard( children: [ @@ -137,7 +138,7 @@ class _CompanyGatewayEditState extends State ), ], ), - ListView( + ScrollableListView( children: [ FormCard(children: [ if (companyGateway.gatewayId != kGatewayCustom) @@ -295,7 +296,7 @@ class _CompanyGatewayEditState extends State ) ], ), - ListView( + ScrollableListView( children: [ if (gateway?.options != null && gateway.options.length > 1) FormCard( diff --git a/lib/ui/company_gateway/view/company_gateway_view.dart b/lib/ui/company_gateway/view/company_gateway_view.dart index 8af801c01..4200c51c9 100644 --- a/lib/ui/company_gateway/view/company_gateway_view.dart +++ b/lib/ui/company_gateway/view/company_gateway_view.dart @@ -11,6 +11,7 @@ import 'package:invoiceninja_flutter/ui/app/entities/entity_list_tile.dart'; import 'package:invoiceninja_flutter/ui/app/entity_header.dart'; import 'package:invoiceninja_flutter/ui/app/lists/list_divider.dart'; import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/app/system_log_viewer.dart'; import 'package:invoiceninja_flutter/ui/app/view_scaffold.dart'; import 'package:invoiceninja_flutter/ui/company_gateway/view/company_gateway_view_vm.dart'; @@ -138,7 +139,7 @@ class _CompanyGatewayOverview extends StatelessWidget { } } - return ListView(children: [ + return ScrollableListView(children: [ EntityHeader( entity: companyGateway, label: localization.processed, diff --git a/lib/ui/dashboard/dashboard_date_range_picker.dart b/lib/ui/dashboard/dashboard_date_range_picker.dart index c821fa8cf..f533aa457 100644 --- a/lib/ui/dashboard/dashboard_date_range_picker.dart +++ b/lib/ui/dashboard/dashboard_date_range_picker.dart @@ -5,6 +5,7 @@ import 'package:invoiceninja_flutter/ui/app/buttons/elevated_button.dart'; import 'package:invoiceninja_flutter/ui/app/dialogs/error_dialog.dart'; import 'package:invoiceninja_flutter/ui/app/forms/date_picker.dart'; import 'package:invoiceninja_flutter/ui/app/responsive_padding.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; @@ -50,8 +51,7 @@ class _DashboardDateRangePickerState extends State { children: [ Padding( padding: const EdgeInsets.all(24.0), - child: ListView( - shrinkWrap: true, + child: ScrollableListView( children: [ Text(localization.dateRange, style: Theme.of(context).textTheme.headline6), diff --git a/lib/ui/dashboard/dashboard_panels.dart b/lib/ui/dashboard/dashboard_panels.dart index e3c88dfb5..db8469c93 100644 --- a/lib/ui/dashboard/dashboard_panels.dart +++ b/lib/ui/dashboard/dashboard_panels.dart @@ -10,6 +10,7 @@ import 'package:invoiceninja_flutter/redux/company/company_selectors.dart'; import 'package:invoiceninja_flutter/redux/dashboard/dashboard_selectors.dart'; import 'package:invoiceninja_flutter/ui/app/app_scrollbar.dart'; import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/dashboard/dashboard_chart.dart'; import 'package:invoiceninja_flutter/ui/dashboard/dashboard_date_range_picker.dart'; import 'package:invoiceninja_flutter/ui/dashboard/dashboard_screen_vm.dart'; @@ -402,42 +403,39 @@ class DashboardPanels extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.only(top: 74), - child: AppScrollbar( - controller: scrollController, - child: ListView( - controller: scrollController, - children: [ - if (company.isModuleEnabled(EntityType.invoice)) - _InvoiceChart( - viewModel: viewModel, - context: context, - onDateSelected: (entityIds) => viewModel - .onSelectionChanged(EntityType.invoice, entityIds)), - if (company.isModuleEnabled(EntityType.invoice)) - _paymentChart( - context: context, - onDateSelected: (entityIds) => viewModel - .onSelectionChanged(EntityType.payment, entityIds)), - if (company.isModuleEnabled(EntityType.quote)) - _quoteChart( - context: context, - onDateSelected: (entityIds) => viewModel - .onSelectionChanged(EntityType.quote, entityIds)), - if (company.isModuleEnabled(EntityType.task)) - _taskChart( - context: context, - onDateSelected: (entityIds) => viewModel - .onSelectionChanged(EntityType.task, entityIds)), - if (company.isModuleEnabled(EntityType.expense)) - _expenseChart( - context: context, - onDateSelected: (entityIds) => viewModel - .onSelectionChanged(EntityType.expense, entityIds)), - SizedBox( - height: 500, - ) - ], - ), + child: ScrollableListView( + scrollController: scrollController, + children: [ + if (company.isModuleEnabled(EntityType.invoice)) + _InvoiceChart( + viewModel: viewModel, + context: context, + onDateSelected: (entityIds) => viewModel.onSelectionChanged( + EntityType.invoice, entityIds)), + if (company.isModuleEnabled(EntityType.invoice)) + _paymentChart( + context: context, + onDateSelected: (entityIds) => viewModel.onSelectionChanged( + EntityType.payment, entityIds)), + if (company.isModuleEnabled(EntityType.quote)) + _quoteChart( + context: context, + onDateSelected: (entityIds) => viewModel.onSelectionChanged( + EntityType.quote, entityIds)), + if (company.isModuleEnabled(EntityType.task)) + _taskChart( + context: context, + onDateSelected: (entityIds) => viewModel.onSelectionChanged( + EntityType.task, entityIds)), + if (company.isModuleEnabled(EntityType.expense)) + _expenseChart( + context: context, + onDateSelected: (entityIds) => viewModel.onSelectionChanged( + EntityType.expense, entityIds)), + SizedBox( + height: 500, + ) + ], ), ), ConstrainedBox( diff --git a/lib/ui/design/edit/design_edit.dart b/lib/ui/design/edit/design_edit.dart index 646c73260..4e53897cd 100644 --- a/lib/ui/design/edit/design_edit.dart +++ b/lib/ui/design/edit/design_edit.dart @@ -13,6 +13,7 @@ import 'package:invoiceninja_flutter/ui/app/forms/app_form.dart'; import 'package:invoiceninja_flutter/ui/app/forms/app_tab_bar.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; import 'package:invoiceninja_flutter/ui/app/forms/design_picker.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/app/variables.dart'; import 'package:invoiceninja_flutter/ui/design/edit/design_edit_vm.dart'; import 'package:invoiceninja_flutter/utils/designs.dart'; @@ -383,8 +384,7 @@ class _DesignSettingsState extends State { Widget build(BuildContext context) { final localization = AppLocalization.of(context); - return ListView( - shrinkWrap: true, + return ScrollableListView( children: [ FormCard( children: [ diff --git a/lib/ui/document/edit/document_edit.dart b/lib/ui/document/edit/document_edit.dart index b892baaf3..64a2fdc4e 100644 --- a/lib/ui/document/edit/document_edit.dart +++ b/lib/ui/document/edit/document_edit.dart @@ -2,6 +2,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:invoiceninja_flutter/ui/app/edit_scaffold.dart'; import 'package:invoiceninja_flutter/ui/app/form_card.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/document/edit/document_edit_vm.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; @@ -92,8 +93,7 @@ class _DocumentEditState extends State { body: Form( key: _formKey, child: Builder(builder: (BuildContext context) { - return ListView( - key: ValueKey(viewModel.document.id), + return ScrollableListView( children: [ FormCard( children: [ diff --git a/lib/ui/expense/edit/expense_edit_details.dart b/lib/ui/expense/edit/expense_edit_details.dart index 73854bdad..3f8d15f37 100644 --- a/lib/ui/expense/edit/expense_edit_details.dart +++ b/lib/ui/expense/edit/expense_edit_details.dart @@ -14,6 +14,7 @@ import 'package:invoiceninja_flutter/ui/app/forms/project_picker.dart'; import 'package:invoiceninja_flutter/ui/app/forms/user_picker.dart'; import 'package:invoiceninja_flutter/ui/app/invoice/tax_rate_dropdown.dart'; import 'package:invoiceninja_flutter/ui/app/invoice/tax_rate_field.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/expense/edit/expense_edit_vm.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; @@ -113,8 +114,7 @@ class ExpenseEditDetailsState extends State { onSavePressed: viewModel.onSavePressed, ); - return ListView( - shrinkWrap: true, + return ScrollableListView( children: [ FormCard( children: [ diff --git a/lib/ui/expense/edit/expense_edit_notes.dart b/lib/ui/expense/edit/expense_edit_notes.dart index 4e283cf95..45fd7cb58 100644 --- a/lib/ui/expense/edit/expense_edit_notes.dart +++ b/lib/ui/expense/edit/expense_edit_notes.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/expense/edit/expense_edit_vm.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; @@ -71,8 +72,7 @@ class ExpenseEditNotesState extends State { Widget build(BuildContext context) { final localization = AppLocalization.of(context); - return ListView( - shrinkWrap: true, + return ScrollableListView( children: [ FormCard( children: [ diff --git a/lib/ui/expense/edit/expense_edit_settings.dart b/lib/ui/expense/edit/expense_edit_settings.dart index a123a76f1..639778d33 100644 --- a/lib/ui/expense/edit/expense_edit_settings.dart +++ b/lib/ui/expense/edit/expense_edit_settings.dart @@ -5,6 +5,7 @@ import 'package:invoiceninja_flutter/ui/app/entity_dropdown.dart'; import 'package:invoiceninja_flutter/ui/app/forms/bool_dropdown_button.dart'; import 'package:invoiceninja_flutter/ui/app/forms/date_picker.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/expense/edit/expense_edit_vm.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; @@ -108,8 +109,7 @@ class ExpenseEditSettingsState extends State { final company = viewModel.company; final expense = viewModel.expense; - return ListView( - shrinkWrap: true, + return ScrollableListView( children: [ FormCard( children: [ diff --git a/lib/ui/expense/view/expense_view_overview.dart b/lib/ui/expense/view/expense_view_overview.dart index 00d0a7a32..6331f9aef 100644 --- a/lib/ui/expense/view/expense_view_overview.dart +++ b/lib/ui/expense/view/expense_view_overview.dart @@ -4,6 +4,7 @@ import 'package:invoiceninja_flutter/ui/app/FieldGrid.dart'; import 'package:invoiceninja_flutter/ui/app/entities/entity_list_tile.dart'; import 'package:invoiceninja_flutter/ui/app/entity_header.dart'; import 'package:invoiceninja_flutter/ui/app/lists/list_divider.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/expense/view/expense_view_vm.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:flutter/material.dart'; @@ -116,7 +117,7 @@ class ExpenseOverview extends StatelessWidget { return listTiles; } - return ListView( + return ScrollableListView( children: [ expense.isConverted ? EntityHeader( diff --git a/lib/ui/expense_category/edit/expense_category_edit.dart b/lib/ui/expense_category/edit/expense_category_edit.dart index 720a263d5..4af52cadc 100644 --- a/lib/ui/expense_category/edit/expense_category_edit.dart +++ b/lib/ui/expense_category/edit/expense_category_edit.dart @@ -4,6 +4,7 @@ import 'package:invoiceninja_flutter/ui/app/edit_scaffold.dart'; import 'package:invoiceninja_flutter/ui/app/form_card.dart'; import 'package:invoiceninja_flutter/ui/app/forms/color_picker.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/expense_category/edit/expense_category_edit_vm.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; @@ -95,7 +96,7 @@ class _ExpenseCategoryEditState extends State { body: Form( key: _formKey, child: Builder(builder: (BuildContext context) { - return ListView( + return ScrollableListView( children: [ FormCard( children: [ diff --git a/lib/ui/expense_category/view/expense_category_view.dart b/lib/ui/expense_category/view/expense_category_view.dart index 88936f732..a2e712b48 100644 --- a/lib/ui/expense_category/view/expense_category_view.dart +++ b/lib/ui/expense_category/view/expense_category_view.dart @@ -5,6 +5,7 @@ import 'package:invoiceninja_flutter/redux/expense_category/expense_category_sel import 'package:invoiceninja_flutter/ui/app/entities/entity_list_tile.dart'; import 'package:invoiceninja_flutter/ui/app/entity_header.dart'; import 'package:invoiceninja_flutter/ui/app/lists/list_divider.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/expense_category/view/expense_category_view_vm.dart'; import 'package:invoiceninja_flutter/ui/app/view_scaffold.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; @@ -38,7 +39,7 @@ class _ExpenseCategoryViewState extends State { isFilter: widget.isFilter, entity: expenseCategory, onBackPressed: () => viewModel.onBackPressed(), - body: ListView( + body: ScrollableListView( children: [ EntityHeader( entity: expenseCategory, diff --git a/lib/ui/group/edit/group_edit.dart b/lib/ui/group/edit/group_edit.dart index e79fcddc8..769c522e0 100644 --- a/lib/ui/group/edit/group_edit.dart +++ b/lib/ui/group/edit/group_edit.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:invoiceninja_flutter/ui/app/edit_scaffold.dart'; import 'package:invoiceninja_flutter/ui/app/form_card.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/group/edit/group_edit_vm.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; @@ -95,7 +96,7 @@ class _GroupEditState extends State { key: _formKey, child: Builder( builder: (BuildContext context) { - return ListView( + return ScrollableListView( children: [ FormCard( children: [ diff --git a/lib/ui/group/view/group_view.dart b/lib/ui/group/view/group_view.dart index d7358ab1f..68840e587 100644 --- a/lib/ui/group/view/group_view.dart +++ b/lib/ui/group/view/group_view.dart @@ -11,6 +11,7 @@ import 'package:invoiceninja_flutter/ui/app/buttons/elevated_button.dart'; import 'package:invoiceninja_flutter/ui/app/document_grid.dart'; import 'package:invoiceninja_flutter/ui/app/entities/entity_list_tile.dart'; import 'package:invoiceninja_flutter/ui/app/lists/list_divider.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/app/view_scaffold.dart'; import 'package:invoiceninja_flutter/ui/group/view/group_view_vm.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; @@ -75,8 +76,7 @@ class _GroupViewState extends State body: TabBarView( controller: _controller, children: [ - ListView( - shrinkWrap: true, + ScrollableListView( children: [ Padding( padding: const EdgeInsets.only(left: 16, bottom: 16, right: 16), diff --git a/lib/ui/invoice/edit/invoice_edit_contacts.dart b/lib/ui/invoice/edit/invoice_edit_contacts.dart index a13d2b90b..97cabac2c 100644 --- a/lib/ui/invoice/edit/invoice_edit_contacts.dart +++ b/lib/ui/invoice/edit/invoice_edit_contacts.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:invoiceninja_flutter/data/models/client_model.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/ui/app/help_text.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/invoice/edit/invoice_edit_contacts_vm.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; @@ -39,8 +40,7 @@ class InvoiceEditContacts extends StatelessWidget { }); } - return ListView( - shrinkWrap: true, + return ScrollableListView( children: contacts.map((contact) { final invitation = invoice.getInvitationForContact(contact); return _ContactListTile( diff --git a/lib/ui/invoice/edit/invoice_edit_desktop.dart b/lib/ui/invoice/edit/invoice_edit_desktop.dart index 938f0c7f5..7f0266baf 100644 --- a/lib/ui/invoice/edit/invoice_edit_desktop.dart +++ b/lib/ui/invoice/edit/invoice_edit_desktop.dart @@ -19,6 +19,7 @@ import 'package:invoiceninja_flutter/ui/app/forms/discount_field.dart'; import 'package:invoiceninja_flutter/ui/app/forms/user_picker.dart'; import 'package:invoiceninja_flutter/ui/app/invoice/tax_rate_dropdown.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/credit/edit/credit_edit_items_vm.dart'; import 'package:invoiceninja_flutter/ui/invoice/edit/invoice_edit_contacts_vm.dart'; import 'package:invoiceninja_flutter/ui/invoice/edit/invoice_edit_details_vm.dart'; @@ -205,7 +206,7 @@ class InvoiceEditDesktopState extends State companySettings: state.company.settings, ); - return ListView( + return ScrollableListView( key: ValueKey('__invoice_${invoice.id}__'), children: [ Row( diff --git a/lib/ui/invoice/edit/invoice_edit_details.dart b/lib/ui/invoice/edit/invoice_edit_details.dart index 4eaf5edb5..c3480cb9c 100644 --- a/lib/ui/invoice/edit/invoice_edit_details.dart +++ b/lib/ui/invoice/edit/invoice_edit_details.dart @@ -9,6 +9,7 @@ import 'package:invoiceninja_flutter/ui/app/forms/design_picker.dart'; import 'package:invoiceninja_flutter/ui/app/forms/discount_field.dart'; import 'package:invoiceninja_flutter/ui/app/forms/user_picker.dart'; import 'package:invoiceninja_flutter/ui/app/invoice/tax_rate_dropdown.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:flutter/material.dart'; @@ -135,7 +136,7 @@ class InvoiceEditDetailsState extends State { final originalInvoice = state.getEntity(invoice.entityType, invoice.id) as InvoiceEntity; - return ListView( + return ScrollableListView( children: [ FormCard( children: [ diff --git a/lib/ui/invoice/edit/invoice_edit_items.dart b/lib/ui/invoice/edit/invoice_edit_items.dart index 372a60b1d..27ccc6922 100644 --- a/lib/ui/invoice/edit/invoice_edit_items.dart +++ b/lib/ui/invoice/edit/invoice_edit_items.dart @@ -1,9 +1,9 @@ -import 'package:invoiceninja_flutter/ui/app/app_scrollbar.dart'; import 'package:invoiceninja_flutter/ui/app/forms/custom_field.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; import 'package:invoiceninja_flutter/ui/app/help_text.dart'; import 'package:invoiceninja_flutter/ui/app/invoice/invoice_item_view.dart'; import 'package:invoiceninja_flutter/ui/app/invoice/tax_rate_dropdown.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/invoice/edit/invoice_edit_items_vm.dart'; import 'package:invoiceninja_flutter/ui/invoice/edit/invoice_edit_vm.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; @@ -29,19 +29,6 @@ class InvoiceEditItems extends StatefulWidget { class _InvoiceEditItemsState extends State { int selectedItemIndex; - ScrollController _scrollController; - - @override - void initState() { - super.initState(); - _scrollController = ScrollController(); - } - - @override - void dispose() { - _scrollController.dispose(); - super.dispose(); - } void _showInvoiceItemEditor(int lineItemIndex, BuildContext context) { showDialog( @@ -83,19 +70,15 @@ class _InvoiceEditItemsState extends State { return HelpText(localization.clickPlusToAddItem); } - return AppScrollbar( - controller: _scrollController, - child: ListView( - controller: _scrollController, - children: [ - for (int i = 0; i < invoice.lineItems.length; i++) - InvoiceItemListTile( - invoice: invoice, - invoiceItem: invoice.lineItems[i], - onTap: () => _showInvoiceItemEditor(i, context), - ) - ], - ), + return ScrollableListView( + children: [ + for (int i = 0; i < invoice.lineItems.length; i++) + InvoiceItemListTile( + invoice: invoice, + invoiceItem: invoice.lineItems[i], + onTap: () => _showInvoiceItemEditor(i, context), + ) + ], ); } } diff --git a/lib/ui/invoice/edit/invoice_edit_notes.dart b/lib/ui/invoice/edit/invoice_edit_notes.dart index 299291d7b..83a4b8f10 100644 --- a/lib/ui/invoice/edit/invoice_edit_notes.dart +++ b/lib/ui/invoice/edit/invoice_edit_notes.dart @@ -3,6 +3,7 @@ import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/ui/app/form_card.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/invoice/edit/invoice_edit_notes_vm.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; @@ -89,7 +90,7 @@ class InvoiceEditNotesState extends State { companySettings: state.company.settings, ); - return ListView( + return ScrollableListView( children: [ FormCard( children: [ diff --git a/lib/ui/invoice/view/invoice_view_contacts.dart b/lib/ui/invoice/view/invoice_view_contacts.dart index 5ef463a9c..570ad13a6 100644 --- a/lib/ui/invoice/view/invoice_view_contacts.dart +++ b/lib/ui/invoice/view/invoice_view_contacts.dart @@ -4,6 +4,7 @@ import 'package:flutter_styled_toast/flutter_styled_toast.dart'; import 'package:invoiceninja_flutter/constants.dart'; import 'package:invoiceninja_flutter/data/models/invoice_model.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/invoice/view/invoice_view_vm.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; @@ -19,8 +20,7 @@ class InvoiceViewContacts extends StatelessWidget { Widget build(BuildContext context) { final invoice = viewModel.invoice; - return ListView( - shrinkWrap: true, + return ScrollableListView( padding: const EdgeInsets.all(8), children: invoice.invitations .map((invitation) => _InvitationListTile( diff --git a/lib/ui/invoice/view/invoice_view_overview.dart b/lib/ui/invoice/view/invoice_view_overview.dart index 5782c2acc..ae59910ec 100644 --- a/lib/ui/invoice/view/invoice_view_overview.dart +++ b/lib/ui/invoice/view/invoice_view_overview.dart @@ -15,6 +15,7 @@ import 'package:invoiceninja_flutter/ui/app/entities/entity_list_tile.dart'; import 'package:invoiceninja_flutter/ui/app/invoice/invoice_item_view.dart'; import 'package:invoiceninja_flutter/ui/app/entity_header.dart'; import 'package:invoiceninja_flutter/ui/app/lists/list_divider.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/invoice/view/invoice_view_vm.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:flutter/material.dart'; @@ -414,7 +415,7 @@ class InvoiceOverview extends StatelessWidget { ]); } - return ListView( + return ScrollableListView( children: widgets, ); } diff --git a/lib/ui/invoice/view/invoice_view_schedule.dart b/lib/ui/invoice/view/invoice_view_schedule.dart index 77bb36b9d..ff2b045cc 100644 --- a/lib/ui/invoice/view/invoice_view_schedule.dart +++ b/lib/ui/invoice/view/invoice_view_schedule.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/invoice/view/invoice_view_vm.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; @@ -14,8 +15,7 @@ class InvoiceViewSchedule extends StatelessWidget { final invoice = viewModel.invoice; final localization = AppLocalization.of(context); - return ListView( - shrinkWrap: true, + return ScrollableListView( padding: const EdgeInsets.all(16), children: [ Row( diff --git a/lib/ui/payment/edit/payment_edit.dart b/lib/ui/payment/edit/payment_edit.dart index 53fbdcd6d..b5ee20abe 100644 --- a/lib/ui/payment/edit/payment_edit.dart +++ b/lib/ui/payment/edit/payment_edit.dart @@ -13,6 +13,7 @@ import 'package:invoiceninja_flutter/redux/static/static_selectors.dart'; import 'package:invoiceninja_flutter/ui/app/form_card.dart'; import 'package:invoiceninja_flutter/ui/app/forms/date_picker.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/payment/edit/payment_edit_vm.dart'; import 'package:invoiceninja_flutter/ui/app/edit_scaffold.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; @@ -326,7 +327,7 @@ class _PaymentEditState extends State { : localization.editPayment, onCancelPressed: (context) => viewModel.onCancelPressed(context), onSavePressed: onSavePressed, - body: ListView( + body: ScrollableListView( children: [body], ), ); diff --git a/lib/ui/payment/view/payment_view.dart b/lib/ui/payment/view/payment_view.dart index 5a26695da..96e70ef08 100644 --- a/lib/ui/payment/view/payment_view.dart +++ b/lib/ui/payment/view/payment_view.dart @@ -11,6 +11,7 @@ import 'package:invoiceninja_flutter/ui/app/entities/entity_list_tile.dart'; import 'package:invoiceninja_flutter/ui/app/icon_message.dart'; import 'package:invoiceninja_flutter/ui/app/entity_header.dart'; import 'package:invoiceninja_flutter/ui/app/lists/list_divider.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/app/view_scaffold.dart'; import 'package:invoiceninja_flutter/ui/payment/view/payment_view_vm.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; @@ -80,7 +81,7 @@ class _PaymentViewState extends State { child: Column( children: [ Expanded( - child: ListView( + child: ScrollableListView( children: [ EntityHeader( entity: payment, diff --git a/lib/ui/payment_term/edit/payment_term_edit.dart b/lib/ui/payment_term/edit/payment_term_edit.dart index 36345235e..000f46e22 100644 --- a/lib/ui/payment_term/edit/payment_term_edit.dart +++ b/lib/ui/payment_term/edit/payment_term_edit.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:invoiceninja_flutter/ui/app/edit_scaffold.dart'; import 'package:invoiceninja_flutter/ui/app/form_card.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/payment_term/edit/payment_term_edit_vm.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; @@ -95,7 +96,7 @@ class _PaymentTermEditState extends State { body: Form( key: _formKey, child: Builder(builder: (BuildContext context) { - return ListView( + return ScrollableListView( children: [ FormCard( children: [ diff --git a/lib/ui/payment_term/view/payment_term_view.dart b/lib/ui/payment_term/view/payment_term_view.dart index 3a20186d0..0362e05cd 100644 --- a/lib/ui/payment_term/view/payment_term_view.dart +++ b/lib/ui/payment_term/view/payment_term_view.dart @@ -1,6 +1,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:invoiceninja_flutter/ui/app/entity_header.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/app/view_scaffold.dart'; import 'package:invoiceninja_flutter/ui/payment_term/view/payment_term_view_vm.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; @@ -27,13 +28,15 @@ class _PaymentTermViewState extends State { return ViewScaffold( entity: paymentTerm, onBackPressed: () => viewModel.onBackPressed(), - body: ListView(children: [ - EntityHeader( - entity: paymentTerm, - label: localization.name, - value: paymentTerm.name, - ), - ]), + body: ScrollableListView( + children: [ + EntityHeader( + entity: paymentTerm, + label: localization.name, + value: paymentTerm.name, + ), + ], + ), ); } } diff --git a/lib/ui/product/edit/product_edit.dart b/lib/ui/product/edit/product_edit.dart index 02b4d36c2..c6288e53b 100644 --- a/lib/ui/product/edit/product_edit.dart +++ b/lib/ui/product/edit/product_edit.dart @@ -5,6 +5,7 @@ import 'package:invoiceninja_flutter/ui/app/forms/custom_field.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; import 'package:invoiceninja_flutter/ui/app/invoice/tax_rate_dropdown.dart'; import 'package:invoiceninja_flutter/ui/app/edit_scaffold.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:flutter/foundation.dart'; @@ -139,7 +140,7 @@ class _ProductEditState extends State { body: AppForm( formKey: _formKey, focusNode: _focusNode, - child: ListView( + child: ScrollableListView( key: ValueKey(widget.viewModel.product.id), children: [ FormCard( diff --git a/lib/ui/product/view/product_view_overview.dart b/lib/ui/product/view/product_view_overview.dart index 42d0138e1..7e329b518 100644 --- a/lib/ui/product/view/product_view_overview.dart +++ b/lib/ui/product/view/product_view_overview.dart @@ -3,6 +3,7 @@ import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/ui/app/FieldGrid.dart'; import 'package:invoiceninja_flutter/ui/app/entity_header.dart'; import 'package:invoiceninja_flutter/ui/app/lists/list_divider.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/product/view/product_view_vm.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; @@ -62,7 +63,7 @@ class _ProductOverviewState extends State { value: product.customValue2); } - return ListView( + return ScrollableListView( children: [ EntityHeader( entity: product, diff --git a/lib/ui/project/edit/project_edit.dart b/lib/ui/project/edit/project_edit.dart index 111308b2b..e5967a0cf 100644 --- a/lib/ui/project/edit/project_edit.dart +++ b/lib/ui/project/edit/project_edit.dart @@ -9,6 +9,7 @@ import 'package:invoiceninja_flutter/ui/app/forms/custom_field.dart'; import 'package:invoiceninja_flutter/ui/app/forms/date_picker.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; import 'package:invoiceninja_flutter/ui/app/forms/user_picker.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/project/edit/project_edit_vm.dart'; import 'package:invoiceninja_flutter/ui/app/edit_scaffold.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; @@ -142,7 +143,7 @@ class _ProjectEditState extends State { body: Form( key: _formKey, child: Builder(builder: (BuildContext context) { - return ListView( + return ScrollableListView( key: ValueKey(viewModel.project.id), children: [ FormCard( diff --git a/lib/ui/project/view/project_view_overview.dart b/lib/ui/project/view/project_view_overview.dart index 84c1b4af8..def6d998e 100644 --- a/lib/ui/project/view/project_view_overview.dart +++ b/lib/ui/project/view/project_view_overview.dart @@ -11,6 +11,7 @@ import 'package:invoiceninja_flutter/ui/app/entities/entity_list_tile.dart'; import 'package:invoiceninja_flutter/ui/app/entity_header.dart'; import 'package:invoiceninja_flutter/ui/app/icon_message.dart'; import 'package:invoiceninja_flutter/ui/app/lists/list_divider.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/project/view/project_view_vm.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; @@ -134,7 +135,7 @@ class _ProjectOverviewState extends State { return RefreshIndicator( onRefresh: () => widget.viewModel.onRefreshed(context), - child: ListView( + child: ScrollableListView( children: _buildView(), ), ); diff --git a/lib/ui/reports/reports_screen.dart b/lib/ui/reports/reports_screen.dart index 8331ea904..ddee7602a 100644 --- a/lib/ui/reports/reports_screen.dart +++ b/lib/ui/reports/reports_screen.dart @@ -21,6 +21,7 @@ import 'package:invoiceninja_flutter/ui/app/forms/date_picker.dart'; 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/presenters/entity_presenter.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/reports/report_charts.dart'; import 'package:invoiceninja_flutter/ui/reports/reports_screen_vm.dart'; import 'package:invoiceninja_flutter/utils/dates.dart'; @@ -247,7 +248,7 @@ class ReportsScreen extends StatelessWidget { ), ], ), - body: ListView( + body: ScrollableListView( key: ValueKey( '${viewModel.state.company.id}_${viewModel.state.isSaving}_${reportsState.report}_${reportsState.group}'), children: [ diff --git a/lib/ui/settings/account_management.dart b/lib/ui/settings/account_management.dart index 4babbae50..67a4359d1 100644 --- a/lib/ui/settings/account_management.dart +++ b/lib/ui/settings/account_management.dart @@ -15,6 +15,7 @@ import 'package:invoiceninja_flutter/ui/app/forms/app_form.dart'; import 'package:invoiceninja_flutter/ui/app/edit_scaffold.dart'; import 'package:invoiceninja_flutter/ui/app/forms/bool_dropdown_button.dart'; import 'package:invoiceninja_flutter/ui/app/lists/list_divider.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/settings/account_management_vm.dart'; import 'package:invoiceninja_flutter/utils/dialogs.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; @@ -99,7 +100,7 @@ class _AccountManagementState extends State tabController: _controller, children: [ _AccountOverview(viewModel: viewModel), - ListView( + ScrollableListView( children: [ FormCard( // TODO change to kModules.keys @@ -123,7 +124,7 @@ class _AccountManagementState extends State }).toList()), ], ), - ListView( + ScrollableListView( children: [ FormCard( children: [ @@ -197,8 +198,7 @@ class _AccountOverview extends StatelessWidget { final company = viewModel.company; final companies = state.companies; - return ListView( - shrinkWrap: true, + return ScrollableListView( children: [ AppHeader( label: localization.plan, diff --git a/lib/ui/settings/buy_now_buttons.dart b/lib/ui/settings/buy_now_buttons.dart index 21320dbf2..ea83ca15b 100644 --- a/lib/ui/settings/buy_now_buttons.dart +++ b/lib/ui/settings/buy_now_buttons.dart @@ -2,6 +2,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:invoiceninja_flutter/ui/app/form_card.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/settings/buy_now_buttons_vm.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/utils/platforms.dart'; @@ -76,7 +77,7 @@ class _BuyNowButtonsState extends State { ), body: Form( key: _formKey, - child: ListView( + child: ScrollableListView( children: [ FormCard( children: [ diff --git a/lib/ui/settings/client_portal.dart b/lib/ui/settings/client_portal.dart index 97043833e..66d7409b1 100644 --- a/lib/ui/settings/client_portal.dart +++ b/lib/ui/settings/client_portal.dart @@ -13,6 +13,7 @@ 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/decorated_form_field.dart'; import 'package:invoiceninja_flutter/ui/app/lists/list_divider.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/settings/client_portal_vm.dart'; import 'package:invoiceninja_flutter/ui/app/edit_scaffold.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; @@ -205,7 +206,7 @@ class _ClientPortalState extends State formKey: _formKey, focusNode: _focusNode, children: [ - ListView( + ScrollableListView( children: [ /* if (!state.settingsUIState.isFiltered) @@ -361,7 +362,7 @@ class _ClientPortalState extends State ) ], ), - ListView( + ScrollableListView( children: [ FormCard( children: [ @@ -425,7 +426,7 @@ class _ClientPortalState extends State ), ], ), - ListView( + ScrollableListView( children: [ FormCard( children: [ @@ -453,7 +454,7 @@ class _ClientPortalState extends State ), ], ), - ListView( + ScrollableListView( children: [ FormCard( children: [ diff --git a/lib/ui/settings/company_details.dart b/lib/ui/settings/company_details.dart index 38f567f61..823335f0e 100644 --- a/lib/ui/settings/company_details.dart +++ b/lib/ui/settings/company_details.dart @@ -17,6 +17,7 @@ import 'package:invoiceninja_flutter/ui/app/forms/bool_dropdown_button.dart'; import 'package:invoiceninja_flutter/ui/app/forms/custom_field.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; import 'package:invoiceninja_flutter/ui/app/resources/cached_image.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/settings/company_details_vm.dart'; import 'package:invoiceninja_flutter/ui/app/edit_scaffold.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; @@ -239,7 +240,7 @@ class _CompanyDetailsState extends State formKey: _formKey, tabController: _controller, children: [ - ListView( + ScrollableListView( children: [ FormCard( children: [ @@ -339,7 +340,7 @@ class _CompanyDetailsState extends State ], ), AutofillGroup( - child: ListView( + child: ScrollableListView( children: [ FormCard( children: [ @@ -397,8 +398,7 @@ class _CompanyDetailsState extends State ), Padding( padding: const EdgeInsets.symmetric(horizontal: 20), - child: ListView( - shrinkWrap: true, + child: ScrollableListView( children: [ Builder( builder: (context) { @@ -452,7 +452,7 @@ class _CompanyDetailsState extends State ], ), ), - ListView( + ScrollableListView( children: [ FormCard( crossAxisAlignment: CrossAxisAlignment.stretch, diff --git a/lib/ui/settings/custom_fields.dart b/lib/ui/settings/custom_fields.dart index 472a3600e..cbdd87f80 100644 --- a/lib/ui/settings/custom_fields.dart +++ b/lib/ui/settings/custom_fields.dart @@ -6,6 +6,7 @@ import 'package:invoiceninja_flutter/ui/app/form_card.dart'; 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/decorated_form_field.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/settings/custom_fields_vm.dart'; import 'package:invoiceninja_flutter/ui/app/edit_scaffold.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; @@ -97,7 +98,7 @@ class _CustomFieldsState extends State formKey: _formKey, focusNode: _focusNode, children: [ - ListView( + ScrollableListView( children: [ CustomFieldsSettings( viewModel: viewModel, @@ -105,7 +106,7 @@ class _CustomFieldsState extends State ), ], ), - ListView(children: [ + ScrollableListView(children: [ CustomFieldsSettings( viewModel: viewModel, fieldType: CustomFieldType.client, @@ -115,7 +116,7 @@ class _CustomFieldsState extends State fieldType: CustomFieldType.contact, ), ]), - ListView( + ScrollableListView( children: [ CustomFieldsSettings( viewModel: viewModel, @@ -123,7 +124,7 @@ class _CustomFieldsState extends State ), ], ), - ListView(children: [ + ScrollableListView(children: [ CustomFieldsSettings( viewModel: viewModel, fieldType: CustomFieldType.invoice, @@ -134,13 +135,13 @@ class _CustomFieldsState extends State showChargeTaxes: true, ), ]), - ListView(children: [ + ScrollableListView(children: [ CustomFieldsSettings( viewModel: viewModel, fieldType: CustomFieldType.payment, ), ]), - ListView(children: [ + ScrollableListView(children: [ CustomFieldsSettings( viewModel: viewModel, fieldType: CustomFieldType.user, diff --git a/lib/ui/settings/device_settings_list.dart b/lib/ui/settings/device_settings_list.dart index bda4e183e..289f58b53 100644 --- a/lib/ui/settings/device_settings_list.dart +++ b/lib/ui/settings/device_settings_list.dart @@ -5,6 +5,7 @@ import 'package:invoiceninja_flutter/redux/ui/pref_state.dart'; import 'package:invoiceninja_flutter/ui/app/form_card.dart'; import 'package:invoiceninja_flutter/ui/app/forms/app_dropdown_button.dart'; import 'package:invoiceninja_flutter/ui/app/forms/bool_dropdown_button.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/settings/device_settings_list_vm.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/utils/platforms.dart'; @@ -42,7 +43,7 @@ class _DeviceSettingsState extends State { ), body: Form( key: _formKey, - child: ListView( + child: ScrollableListView( children: [ FormCard( children: [ diff --git a/lib/ui/settings/generated_numbers.dart b/lib/ui/settings/generated_numbers.dart index 130f38cd7..1739618b9 100644 --- a/lib/ui/settings/generated_numbers.dart +++ b/lib/ui/settings/generated_numbers.dart @@ -9,6 +9,7 @@ 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/date_picker.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/settings/generated_numbers_vm.dart'; import 'package:invoiceninja_flutter/ui/app/edit_scaffold.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; @@ -231,7 +232,7 @@ class _GeneratedNumbersState extends State formKey: _formKey, focusNode: _focusNode, children: [ - ListView( + ScrollableListView( children: [ FormCard( children: [ @@ -487,7 +488,7 @@ class _EntityNumberSettingsState extends State { Widget build(BuildContext context) { final localization = AppLocalization.of(context); - return ListView( + return ScrollableListView( children: [ FormCard( children: [ diff --git a/lib/ui/settings/import_export.dart b/lib/ui/settings/import_export.dart index a62c4ec8d..a195f8504 100644 --- a/lib/ui/settings/import_export.dart +++ b/lib/ui/settings/import_export.dart @@ -16,6 +16,7 @@ import 'package:flutter_redux/flutter_redux.dart'; import 'package:invoiceninja_flutter/ui/app/form_card.dart'; import 'package:invoiceninja_flutter/ui/app/forms/app_form.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/settings/import_export_vm.dart'; import 'package:invoiceninja_flutter/utils/dialogs.dart'; import 'package:invoiceninja_flutter/utils/files.dart'; @@ -69,7 +70,7 @@ class _ImportExportState extends State { body: AppForm( formKey: _formKey, focusNode: _focusNode, - child: ListView( + child: ScrollableListView( children: [ if (_response == null) _FileImport( @@ -399,10 +400,12 @@ class __FileMapperState extends State<_FileMapper> { final state = StoreProvider.of(context).state; final credentials = state.credentials; final url = '${credentials.url}/import'; - final convertedMapping={}; + final convertedMapping = {}; - for(MapEntry> e in _mapping.entries){ - convertedMapping[e.key] = new ImportRequestMapping(BuiltMap(e.value)); + for (MapEntry> e + in _mapping.entries) { + convertedMapping[e.key] = + new ImportRequestMapping(BuiltMap(e.value)); } setState(() => _isLoading = true); diff --git a/lib/ui/settings/integrations.dart b/lib/ui/settings/integrations.dart index 552cbd446..350f20693 100644 --- a/lib/ui/settings/integrations.dart +++ b/lib/ui/settings/integrations.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:invoiceninja_flutter/ui/app/form_card.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; import 'package:invoiceninja_flutter/ui/app/forms/learn_more.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/settings/integrations_vm.dart'; import 'package:invoiceninja_flutter/ui/app/edit_scaffold.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; @@ -80,7 +81,7 @@ class _IntegrationSettingsState extends State { return EditScaffold( title: localization.integrations, onSavePressed: widget.viewModel.onSavePressed, - body: ListView( + body: ScrollableListView( children: [ FormCard( children: [ diff --git a/lib/ui/settings/invoice_design.dart b/lib/ui/settings/invoice_design.dart index df10b16af..3dd2f4726 100644 --- a/lib/ui/settings/invoice_design.dart +++ b/lib/ui/settings/invoice_design.dart @@ -24,6 +24,7 @@ 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/design_picker.dart'; import 'package:invoiceninja_flutter/ui/app/forms/learn_more.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/settings/invoice_design_vm.dart'; import 'package:invoiceninja_flutter/ui/app/edit_scaffold.dart'; import 'package:invoiceninja_flutter/utils/fonts.dart'; @@ -108,7 +109,7 @@ class _InvoiceDesignState extends State formKey: _formKey, focusNode: _focusNode, children: [ - ListView( + ScrollableListView( children: [ Padding( padding: const EdgeInsets.only(right: 16, bottom: 10, left: 16), @@ -229,7 +230,7 @@ class _InvoiceDesignState extends State ), ], ), - ListView( + ScrollableListView( padding: const EdgeInsets.all(10), children: [ FormCard( diff --git a/lib/ui/settings/localization_settings.dart b/lib/ui/settings/localization_settings.dart index 1ca765690..375a32c19 100644 --- a/lib/ui/settings/localization_settings.dart +++ b/lib/ui/settings/localization_settings.dart @@ -14,6 +14,7 @@ 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/bool_dropdown_button.dart'; import 'package:invoiceninja_flutter/ui/app/forms/learn_more.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/settings/localization_vm.dart'; import 'package:invoiceninja_flutter/ui/app/edit_scaffold.dart'; import 'package:invoiceninja_flutter/utils/dialogs.dart'; @@ -128,7 +129,7 @@ class _LocalizationSettingsState extends State focusNode: _focusNode, tabController: _controller, children: [ - ListView( + ScrollableListView( children: [ FormCard( children: [ @@ -249,7 +250,7 @@ class _LocalizationSettingsState extends State ), ], ), - ListView( + ScrollableListView( children: [ FormCard( crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/ui/settings/settings_list.dart b/lib/ui/settings/settings_list.dart index 52f5d63ec..049ad1934 100644 --- a/lib/ui/settings/settings_list.dart +++ b/lib/ui/settings/settings_list.dart @@ -5,6 +5,7 @@ import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/ui/app/app_scrollbar.dart'; import 'package:invoiceninja_flutter/ui/app/lists/list_filter.dart'; import 'package:invoiceninja_flutter/ui/app/lists/selected_indicator.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/settings/settings_list_vm.dart'; import 'package:invoiceninja_flutter/utils/icons.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; @@ -50,7 +51,7 @@ class _SettingsListState extends State { } if (!state.userCompany.isAdmin) - return ListView( + return ScrollableListView( children: [ SettingsListTile( section: kSettingsUserDetails, @@ -68,144 +69,142 @@ class _SettingsListState extends State { filter: settingsUIState.filter, ); - return AppScrollbar( - controller: _scrollController, - child: ListView( - controller: _scrollController, - children: [ - if (settingsUIState.isFiltered) - Container( - color: Colors.orangeAccent, - child: ListFilterMessage( - filterEntityType: settingsUIState.entityType, - filterEntityId: settingsUIState.entityType == EntityType.group - ? settingsUIState.group.id - : settingsUIState.client.id, - onPressed: settingsUIState.entityType == EntityType.client - ? widget.viewModel.onViewClientPressed - : widget.viewModel.onViewGroupPressed, - onClearPressed: widget.viewModel.onClearSettingsFilterPressed, - isSettings: true, - ), - ), + return ScrollableListView( + scrollController: _scrollController, + children: [ + if (settingsUIState.isFiltered) Container( - color: Theme.of(context).backgroundColor, - padding: const EdgeInsets.only(left: 19, top: 16, bottom: 16), - child: Text( - localization.basicSettings, - style: Theme.of(context).textTheme.bodyText2, + color: Colors.orangeAccent, + child: ListFilterMessage( + filterEntityType: settingsUIState.entityType, + filterEntityId: settingsUIState.entityType == EntityType.group + ? settingsUIState.group.id + : settingsUIState.client.id, + onPressed: settingsUIState.entityType == EntityType.client + ? widget.viewModel.onViewClientPressed + : widget.viewModel.onViewGroupPressed, + onClearPressed: widget.viewModel.onClearSettingsFilterPressed, + isSettings: true, ), ), + Container( + color: Theme.of(context).backgroundColor, + padding: const EdgeInsets.only(left: 19, top: 16, bottom: 16), + child: Text( + localization.basicSettings, + style: Theme.of(context).textTheme.bodyText2, + ), + ), + SettingsListTile( + section: kSettingsCompanyDetails, + viewModel: widget.viewModel, + ), + if (showAll) SettingsListTile( - section: kSettingsCompanyDetails, + section: kSettingsUserDetails, viewModel: widget.viewModel, ), - if (showAll) - SettingsListTile( - section: kSettingsUserDetails, - viewModel: widget.viewModel, - ), + SettingsListTile( + section: kSettingsLocalization, + viewModel: widget.viewModel, + ), + SettingsListTile( + section: kSettingsOnlinePayments, + viewModel: widget.viewModel, + ), + if (showAll) SettingsListTile( - section: kSettingsLocalization, + section: kSettingsTaxSettings, viewModel: widget.viewModel, ), + if (showAll) SettingsListTile( - section: kSettingsOnlinePayments, + section: kSettingsProducts, viewModel: widget.viewModel, ), - if (showAll) - SettingsListTile( - section: kSettingsTaxSettings, - viewModel: widget.viewModel, - ), - if (showAll) - SettingsListTile( - section: kSettingsProducts, - viewModel: widget.viewModel, - ), - if (state.company.isModuleEnabled(EntityType.task)) - SettingsListTile( - section: kSettingsTasks, - viewModel: widget.viewModel, - ), - if (showAll && state.company.isModuleEnabled(EntityType.expense)) - SettingsListTile( - section: kSettingsExpenses, - viewModel: widget.viewModel, - ), - // TODO Re-entable - /* + if (state.company.isModuleEnabled(EntityType.task)) + SettingsListTile( + section: kSettingsTasks, + viewModel: widget.viewModel, + ), + if (showAll && state.company.isModuleEnabled(EntityType.expense)) + SettingsListTile( + section: kSettingsExpenses, + viewModel: widget.viewModel, + ), + // TODO Re-entable + /* if (showAll) SettingsListTile( section: kSettingsIntegrations, viewModel: viewModel, ), */ - if (showAll) - SettingsListTile( - section: kSettingsImportExport, - viewModel: widget.viewModel, - ), - if (showAll) - SettingsListTile( - section: kSettingsDeviceSettings, - viewModel: widget.viewModel, - ), - if (showAll && state.userCompany.isOwner) - SettingsListTile( - section: kSettingsAccountManagement, - viewModel: widget.viewModel, - ), - Container( - color: Theme.of(context).backgroundColor, - padding: const EdgeInsets.only(left: 19, top: 16, bottom: 16), - child: Text( - localization.advancedSettings, - style: Theme.of(context).textTheme.bodyText2, - ), + if (showAll) + SettingsListTile( + section: kSettingsImportExport, + viewModel: widget.viewModel, ), + if (showAll) + SettingsListTile( + section: kSettingsDeviceSettings, + viewModel: widget.viewModel, + ), + if (showAll && state.userCompany.isOwner) + SettingsListTile( + section: kSettingsAccountManagement, + viewModel: widget.viewModel, + ), + Container( + color: Theme.of(context).backgroundColor, + padding: const EdgeInsets.only(left: 19, top: 16, bottom: 16), + child: Text( + localization.advancedSettings, + style: Theme.of(context).textTheme.bodyText2, + ), + ), + SettingsListTile( + section: kSettingsInvoiceDesign, + viewModel: widget.viewModel, + ), + if (showAll) SettingsListTile( - section: kSettingsInvoiceDesign, + section: kSettingsCustomFields, viewModel: widget.viewModel, ), - if (showAll) - SettingsListTile( - section: kSettingsCustomFields, - viewModel: widget.viewModel, - ), - SettingsListTile( - section: kSettingsGeneratedNumbers, - viewModel: widget.viewModel, - ), - SettingsListTile( - section: kSettingsEmailSettings, - viewModel: widget.viewModel, - ), - SettingsListTile( - section: kSettingsClientPortal, - viewModel: widget.viewModel, - ), - SettingsListTile( - section: kSettingsTemplatesAndReminders, - viewModel: widget.viewModel, - ), - SettingsListTile( - section: kSettingsGroupSettings, - viewModel: widget.viewModel, - ), - SettingsListTile( - section: kSettingsWorkflowSettings, - viewModel: widget.viewModel, - ), - /* + SettingsListTile( + section: kSettingsGeneratedNumbers, + viewModel: widget.viewModel, + ), + SettingsListTile( + section: kSettingsEmailSettings, + viewModel: widget.viewModel, + ), + SettingsListTile( + section: kSettingsClientPortal, + viewModel: widget.viewModel, + ), + SettingsListTile( + section: kSettingsTemplatesAndReminders, + viewModel: widget.viewModel, + ), + SettingsListTile( + section: kSettingsGroupSettings, + viewModel: widget.viewModel, + ), + SettingsListTile( + section: kSettingsWorkflowSettings, + viewModel: widget.viewModel, + ), + /* if (showAll) SettingsListTile( section: kSettingsBuyNowButtons, viewModel: viewModel, ), */ - /* + /* SettingsListTile( section: kSettingsCreditCardsAndBanks, viewModel: viewModel, @@ -215,13 +214,12 @@ class _SettingsListState extends State { viewModel: viewModel, ), */ - if (showAll) - SettingsListTile( - section: kSettingsUserManagement, - viewModel: widget.viewModel, - ), - ], - ), + if (showAll) + SettingsListTile( + section: kSettingsUserManagement, + viewModel: widget.viewModel, + ), + ], ); } } @@ -507,7 +505,7 @@ class SettingsSearch extends StatelessWidget { @override Widget build(BuildContext context) { final localization = AppLocalization.of(context); - return ListView( + return ScrollableListView( children: [ for (var section in map.keys) for (int i = 0; i < map[section].length; i++) diff --git a/lib/ui/settings/templates_and_reminders.dart b/lib/ui/settings/templates_and_reminders.dart index 50b28200f..96830e9da 100644 --- a/lib/ui/settings/templates_and_reminders.dart +++ b/lib/ui/settings/templates_and_reminders.dart @@ -12,6 +12,7 @@ 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/decorated_form_field.dart'; import 'package:invoiceninja_flutter/ui/app/edit_scaffold.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/app/variables.dart'; import 'package:invoiceninja_flutter/ui/settings/templates_and_reminders_vm.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; @@ -245,7 +246,7 @@ class _TemplatesAndRemindersState extends State formKey: _formKey, focusNode: _focusNode, children: [ - ListView( + ScrollableListView( children: [ FormCard(children: [ AppDropdownButton( diff --git a/lib/ui/settings/user_details.dart b/lib/ui/settings/user_details.dart index d1337df43..2f6cc1881 100644 --- a/lib/ui/settings/user_details.dart +++ b/lib/ui/settings/user_details.dart @@ -15,6 +15,7 @@ import 'package:invoiceninja_flutter/ui/app/edit_scaffold.dart'; import 'package:invoiceninja_flutter/ui/app/forms/notification_settings.dart'; import 'package:invoiceninja_flutter/ui/app/forms/password_field.dart'; import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/settings/user_details_vm.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/dialogs.dart'; @@ -155,7 +156,7 @@ class _UserDetailsState extends State formKey: _formKey, tabController: _controller, children: [ - ListView( + ScrollableListView( children: [ FormCard(children: [ DecoratedFormField( @@ -270,7 +271,7 @@ class _UserDetailsState extends State ), ], ), - ListView( + ScrollableListView( children: [ NotificationSettings( user: user, diff --git a/lib/ui/settings/workflow_settings.dart b/lib/ui/settings/workflow_settings.dart index fc1f6b083..5126897bc 100644 --- a/lib/ui/settings/workflow_settings.dart +++ b/lib/ui/settings/workflow_settings.dart @@ -8,6 +8,7 @@ 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/bool_dropdown_button.dart'; import 'package:invoiceninja_flutter/ui/app/edit_scaffold.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/settings/workflow_vm.dart'; import 'package:invoiceninja_flutter/utils/icons.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; @@ -86,7 +87,7 @@ class _WorkflowSettingsState extends State formKey: _formKey, focusNode: _focusNode, children: [ - ListView( + ScrollableListView( children: [ FormCard(children: [ BoolDropdownButton( @@ -129,7 +130,7 @@ class _WorkflowSettingsState extends State ), ], ), - ListView( + ScrollableListView( children: [ FormCard( children: [ diff --git a/lib/ui/task/edit/task_edit_desktop.dart b/lib/ui/task/edit/task_edit_desktop.dart index 78e35c382..6dd59e1e5 100644 --- a/lib/ui/task/edit/task_edit_desktop.dart +++ b/lib/ui/task/edit/task_edit_desktop.dart @@ -13,6 +13,7 @@ import 'package:invoiceninja_flutter/ui/app/forms/dynamic_selector.dart'; import 'package:invoiceninja_flutter/ui/app/forms/project_picker.dart'; import 'package:invoiceninja_flutter/ui/app/forms/time_picker.dart'; import 'package:invoiceninja_flutter/ui/app/forms/user_picker.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/invoice/edit/invoice_edit_items_desktop.dart'; import 'package:invoiceninja_flutter/ui/task/edit/task_edit_details_vm.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; @@ -134,7 +135,7 @@ class _TaskEditDesktopState extends State { ? client.currencyId : company.currencyId); - return ListView( + return ScrollableListView( children: [ Row( crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/ui/task/edit/task_edit_details.dart b/lib/ui/task/edit/task_edit_details.dart index 6f4af3307..bc913e6dc 100644 --- a/lib/ui/task/edit/task_edit_details.dart +++ b/lib/ui/task/edit/task_edit_details.dart @@ -9,6 +9,7 @@ import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; import 'package:invoiceninja_flutter/ui/app/forms/dynamic_selector.dart'; import 'package:invoiceninja_flutter/ui/app/forms/project_picker.dart'; import 'package:invoiceninja_flutter/ui/app/forms/user_picker.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/task/edit/task_edit_details_vm.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; @@ -118,7 +119,7 @@ class _TaskEditDetailsState extends State { ? client.currencyId : company.currencyId); - return ListView( + return ScrollableListView( children: [ FormCard( children: [ diff --git a/lib/ui/task/edit/task_edit_times.dart b/lib/ui/task/edit/task_edit_times.dart index 40ac553fb..813979a93 100644 --- a/lib/ui/task/edit/task_edit_times.dart +++ b/lib/ui/task/edit/task_edit_times.dart @@ -4,6 +4,7 @@ import 'package:invoiceninja_flutter/ui/app/forms/duration_picker.dart'; import 'package:invoiceninja_flutter/ui/app/forms/time_picker.dart'; import 'package:invoiceninja_flutter/ui/app/help_text.dart'; import 'package:invoiceninja_flutter/ui/app/responsive_padding.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/task/edit/task_edit_times_vm.dart'; import 'package:invoiceninja_flutter/ui/task/task_time_view.dart'; import 'package:flutter/material.dart'; @@ -74,7 +75,7 @@ class _TaskEditTimesState extends State { onTap: (context) => _showTaskTimeEditor(taskTime, context), )); - return ListView( + return ScrollableListView( children: taskTimeWidgets.toList(), ); } diff --git a/lib/ui/task/view/task_view_overview.dart b/lib/ui/task/view/task_view_overview.dart index df30031f3..6b4cef486 100644 --- a/lib/ui/task/view/task_view_overview.dart +++ b/lib/ui/task/view/task_view_overview.dart @@ -8,6 +8,7 @@ import 'package:invoiceninja_flutter/ui/app/entities/entity_list_tile.dart'; import 'package:invoiceninja_flutter/ui/app/entity_header.dart'; import 'package:invoiceninja_flutter/ui/app/icon_message.dart'; import 'package:invoiceninja_flutter/ui/app/lists/list_divider.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/task/task_time_view.dart'; import 'package:invoiceninja_flutter/ui/task/view/task_view_vm.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; @@ -181,7 +182,7 @@ class _TaskOverviewState extends State { return RefreshIndicator( onRefresh: () => viewModel.onRefreshed(context), - child: ListView( + child: ScrollableListView( children: _buildView(), ), ); diff --git a/lib/ui/task_status/edit/task_status_edit.dart b/lib/ui/task_status/edit/task_status_edit.dart index c17b290fe..6c2077801 100644 --- a/lib/ui/task_status/edit/task_status_edit.dart +++ b/lib/ui/task_status/edit/task_status_edit.dart @@ -4,6 +4,7 @@ import 'package:invoiceninja_flutter/ui/app/edit_scaffold.dart'; import 'package:invoiceninja_flutter/ui/app/form_card.dart'; import 'package:invoiceninja_flutter/ui/app/forms/color_picker.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/task_status/edit/task_status_edit_vm.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; @@ -93,7 +94,7 @@ class _TaskStatusEditState extends State { body: Form( key: _formKey, child: Builder(builder: (BuildContext context) { - return ListView( + return ScrollableListView( children: [ FormCard( children: [ diff --git a/lib/ui/task_status/view/task_status_view.dart b/lib/ui/task_status/view/task_status_view.dart index d5a8cad7e..25a10b8a5 100644 --- a/lib/ui/task_status/view/task_status_view.dart +++ b/lib/ui/task_status/view/task_status_view.dart @@ -5,6 +5,7 @@ import 'package:invoiceninja_flutter/redux/task_status/task_status_selectors.dar import 'package:invoiceninja_flutter/ui/app/entities/entity_list_tile.dart'; import 'package:invoiceninja_flutter/ui/app/entity_header.dart'; import 'package:invoiceninja_flutter/ui/app/lists/list_divider.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/task_status/view/task_status_view_vm.dart'; import 'package:invoiceninja_flutter/ui/app/view_scaffold.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; @@ -38,7 +39,7 @@ class _TaskStatusViewState extends State { isFilter: widget.isFilter, entity: taskStatus, onBackPressed: () => viewModel.onBackPressed(), - body: ListView( + body: ScrollableListView( children: [ EntityHeader( entity: taskStatus, diff --git a/lib/ui/tax_rate/view/tax_rate_view.dart b/lib/ui/tax_rate/view/tax_rate_view.dart index 677ecb3b4..f95048a6f 100644 --- a/lib/ui/tax_rate/view/tax_rate_view.dart +++ b/lib/ui/tax_rate/view/tax_rate_view.dart @@ -1,6 +1,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:invoiceninja_flutter/ui/app/entity_header.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/app/view_scaffold.dart'; import 'package:invoiceninja_flutter/ui/tax_rate/view/tax_rate_view_vm.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; @@ -31,7 +32,7 @@ class _TaxRateViewState extends State { isFilter: widget.isFilter, entity: taxRate, onBackPressed: () => viewModel.onBackPressed(), - body: ListView(children: [ + body: ScrollableListView(children: [ EntityHeader( entity: taxRate, label: localization.name, diff --git a/lib/ui/token/edit/token_edit.dart b/lib/ui/token/edit/token_edit.dart index 62a1113bd..602517886 100644 --- a/lib/ui/token/edit/token_edit.dart +++ b/lib/ui/token/edit/token_edit.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:invoiceninja_flutter/ui/app/edit_scaffold.dart'; import 'package:invoiceninja_flutter/ui/app/form_card.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/token/edit/token_edit_vm.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; @@ -90,7 +91,7 @@ class _TokenEditState extends State { body: Form( key: _formKey, child: Builder(builder: (BuildContext context) { - return ListView( + return ScrollableListView( children: [ FormCard( children: [ diff --git a/lib/ui/token/view/token_view.dart b/lib/ui/token/view/token_view.dart index 5dddac2fd..a03dfc12f 100644 --- a/lib/ui/token/view/token_view.dart +++ b/lib/ui/token/view/token_view.dart @@ -5,6 +5,7 @@ import 'package:invoiceninja_flutter/data/models/token_model.dart'; import 'package:invoiceninja_flutter/redux/token/token_actions.dart'; import 'package:invoiceninja_flutter/ui/app/entity_header.dart'; import 'package:invoiceninja_flutter/ui/app/lists/list_divider.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/app/view_scaffold.dart'; import 'package:invoiceninja_flutter/ui/token/view/token_view_vm.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; @@ -36,7 +37,7 @@ class _TokenViewState extends State { isFilter: widget.isFilter, onBackPressed: () => viewModel.onBackPressed(), entity: token, - body: ListView( + body: ScrollableListView( children: [ EntityHeader( entity: token, diff --git a/lib/ui/user/edit/user_edit.dart b/lib/ui/user/edit/user_edit.dart index 7a2ffb8ee..5a59111db 100644 --- a/lib/ui/user/edit/user_edit.dart +++ b/lib/ui/user/edit/user_edit.dart @@ -10,6 +10,7 @@ import 'package:invoiceninja_flutter/ui/app/forms/app_form.dart'; import 'package:invoiceninja_flutter/ui/app/forms/custom_field.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; import 'package:invoiceninja_flutter/ui/app/forms/notification_settings.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/user/edit/user_edit_vm.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; @@ -179,7 +180,7 @@ class _UserEditState extends State formKey: _formKey, tabController: _controller, children: [ - ListView( + ScrollableListView( children: [ FormCard( children: [ @@ -245,7 +246,7 @@ class _UserEditState extends State ), ], ), - ListView( + ScrollableListView( children: [ NotificationSettings( user: user, @@ -256,7 +257,7 @@ class _UserEditState extends State ), ], ), - ListView( + ScrollableListView( children: [ FormCard( children: [ diff --git a/lib/ui/user/view/user_view.dart b/lib/ui/user/view/user_view.dart index 2e808d56a..87e800972 100644 --- a/lib/ui/user/view/user_view.dart +++ b/lib/ui/user/view/user_view.dart @@ -13,6 +13,7 @@ import 'package:invoiceninja_flutter/ui/app/entities/entity_list_tile.dart'; import 'package:invoiceninja_flutter/ui/app/entity_header.dart'; import 'package:invoiceninja_flutter/ui/app/icon_message.dart'; import 'package:invoiceninja_flutter/ui/app/lists/list_divider.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/app/view_scaffold.dart'; import 'package:invoiceninja_flutter/ui/user/view/user_view_vm.dart'; import 'package:flutter/material.dart'; @@ -39,8 +40,7 @@ class UserView extends StatelessWidget { isFilter: isFilter, entity: user, onBackPressed: () => viewModel.onBackPressed(), - body: ListView( - shrinkWrap: true, + body: ScrollableListView( children: [ if (user.emailVerifiedAt == null) IconMessage(localization.emailSentToConfirmEmail, diff --git a/lib/ui/vendor/edit/vendor_edit_address.dart b/lib/ui/vendor/edit/vendor_edit_address.dart index 1e177cf67..37a7adcde 100644 --- a/lib/ui/vendor/edit/vendor_edit_address.dart +++ b/lib/ui/vendor/edit/vendor_edit_address.dart @@ -3,6 +3,7 @@ import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/ui/app/entity_dropdown.dart'; import 'package:invoiceninja_flutter/ui/app/form_card.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/vendor/edit/vendor_edit_vm.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; @@ -86,7 +87,7 @@ class VendorEditAddressState extends State { final viewModel = widget.viewModel; final vendor = viewModel.vendor; - return ListView(shrinkWrap: true, children: [ + return ScrollableListView(children: [ FormCard( children: [ DecoratedFormField( diff --git a/lib/ui/vendor/edit/vendor_edit_contacts.dart b/lib/ui/vendor/edit/vendor_edit_contacts.dart index 3d2e57d00..fc7beee72 100644 --- a/lib/ui/vendor/edit/vendor_edit_contacts.dart +++ b/lib/ui/vendor/edit/vendor_edit_contacts.dart @@ -7,6 +7,7 @@ import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/ui/app/buttons/elevated_button.dart'; import 'package:invoiceninja_flutter/ui/app/form_card.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/vendor/edit/vendor_edit_contacts_vm.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/contacts.dart'; @@ -85,7 +86,7 @@ class _VendorEditContactsState extends State { }); } - return ListView( + return ScrollableListView( children: [] ..addAll(contacts) ..add(Padding( diff --git a/lib/ui/vendor/edit/vendor_edit_details.dart b/lib/ui/vendor/edit/vendor_edit_details.dart index d1f46f9ff..bccb16010 100644 --- a/lib/ui/vendor/edit/vendor_edit_details.dart +++ b/lib/ui/vendor/edit/vendor_edit_details.dart @@ -8,6 +8,7 @@ import 'package:invoiceninja_flutter/ui/app/form_card.dart'; import 'package:invoiceninja_flutter/ui/app/forms/custom_field.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; import 'package:invoiceninja_flutter/ui/app/forms/user_picker.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/vendor/edit/vendor_edit_vm.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/contacts.dart'; @@ -122,8 +123,7 @@ class VendorEditDetailsState extends State { final viewModel = widget.viewModel; final vendor = viewModel.vendor; - return ListView( - shrinkWrap: true, + return ScrollableListView( children: [ FormCard( children: [ diff --git a/lib/ui/vendor/edit/vendor_edit_notes.dart b/lib/ui/vendor/edit/vendor_edit_notes.dart index 738953f7d..aa4c5d259 100644 --- a/lib/ui/vendor/edit/vendor_edit_notes.dart +++ b/lib/ui/vendor/edit/vendor_edit_notes.dart @@ -3,6 +3,7 @@ import 'package:flutter/services.dart'; import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/ui/app/entity_dropdown.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/vendor/edit/vendor_edit_vm.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; @@ -77,8 +78,7 @@ class VendorEditNotesState extends State { final staticState = viewModel.state.staticState; final vendor = viewModel.vendor; - return ListView( - shrinkWrap: true, + return ScrollableListView( children: [ FormCard( children: [ diff --git a/lib/ui/vendor/view/vendor_view_details.dart b/lib/ui/vendor/view/vendor_view_details.dart index 8edaf929f..da6f83361 100644 --- a/lib/ui/vendor/view/vendor_view_details.dart +++ b/lib/ui/vendor/view/vendor_view_details.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/ui/app/lists/app_list_tile.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/utils/platforms.dart'; @@ -149,7 +150,7 @@ class _VendorViewDetailsState extends State { return listTiles; } - return ListView( + return ScrollableListView( children: _buildDetailsList(), ); } diff --git a/lib/ui/vendor/view/vendor_view_overview.dart b/lib/ui/vendor/view/vendor_view_overview.dart index 179571617..b7fe5c1eb 100644 --- a/lib/ui/vendor/view/vendor_view_overview.dart +++ b/lib/ui/vendor/view/vendor_view_overview.dart @@ -8,6 +8,7 @@ import 'package:invoiceninja_flutter/ui/app/FieldGrid.dart'; import 'package:invoiceninja_flutter/ui/app/entities/entity_list_tile.dart'; import 'package:invoiceninja_flutter/ui/app/entity_header.dart'; import 'package:invoiceninja_flutter/ui/app/lists/list_divider.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/vendor/view/vendor_view_vm.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:flutter/material.dart'; @@ -56,7 +57,7 @@ class VendorOverview extends StatelessWidget { value: vendor.customValue2); } - return ListView( + return ScrollableListView( children: [ EntityHeader( entity: vendor, diff --git a/lib/ui/webhook/edit/webhook_edit.dart b/lib/ui/webhook/edit/webhook_edit.dart index 1c579e98c..9ea3d0015 100644 --- a/lib/ui/webhook/edit/webhook_edit.dart +++ b/lib/ui/webhook/edit/webhook_edit.dart @@ -5,6 +5,7 @@ import 'package:invoiceninja_flutter/ui/app/edit_scaffold.dart'; import 'package:invoiceninja_flutter/ui/app/form_card.dart'; import 'package:invoiceninja_flutter/ui/app/forms/app_dropdown_button.dart'; import 'package:invoiceninja_flutter/ui/app/forms/decorated_form_field.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/webhook/edit/webhook_edit_vm.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; @@ -93,7 +94,7 @@ class _WebhookEditState extends State { body: Form( key: _formKey, child: Builder(builder: (BuildContext context) { - return ListView( + return ScrollableListView( children: [ FormCard( children: [ diff --git a/lib/ui/webhook/view/webhook_view.dart b/lib/ui/webhook/view/webhook_view.dart index 57648bdd4..9cf49eb74 100644 --- a/lib/ui/webhook/view/webhook_view.dart +++ b/lib/ui/webhook/view/webhook_view.dart @@ -4,6 +4,7 @@ import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/webhook/webhook_actions.dart'; import 'package:invoiceninja_flutter/ui/app/entity_header.dart'; import 'package:invoiceninja_flutter/ui/app/lists/list_divider.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/ui/app/view_scaffold.dart'; import 'package:invoiceninja_flutter/ui/webhook/view/webhook_view_vm.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; @@ -34,7 +35,7 @@ class _WebhookViewState extends State { isFilter: widget.isFilter, onBackPressed: () => viewModel.onBackPressed(), entity: webhook, - body: ListView( + body: ScrollableListView( children: [ EntityHeader( entity: webhook, diff --git a/samples/form_keys.dart b/samples/form_keys.dart index c21bcc3b3..031ff1971 100644 --- a/samples/form_keys.dart +++ b/samples/form_keys.dart @@ -1,6 +1,7 @@ // https://hillelcoren.com/2018/06/12/flutter-complex-forms-with-multiple-tabs-and-relationships/ import 'package:flutter/material.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/utils/platforms.dart'; // Sample entity classes @@ -229,7 +230,7 @@ class ContactsPageState extends State ), )); - return ListView( + return ScrollableListView( children: items, ); } diff --git a/samples/form_redux.dart b/samples/form_redux.dart index 1b3eb3d14..2cfffc189 100644 --- a/samples/form_redux.dart +++ b/samples/form_redux.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_redux/flutter_redux.dart'; +import 'package:invoiceninja_flutter/ui/app/scrollable_listview.dart'; import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:redux/redux.dart'; import 'package:redux_logging/redux_logging.dart'; @@ -251,7 +252,7 @@ class ContactsPage extends StatelessWidget { //key: Key('__contact_${contact.id}__'), index: store.state.client.contacts.indexOf(contact))); - return ListView( + return ScrollableListView( children: [] ..addAll(contacts) ..add(Padding( diff --git a/stubs/ui/stub/edit/stub_edit b/stubs/ui/stub/edit/stub_edit index 2380e27fb..f0bb657e2 100644 --- a/stubs/ui/stub/edit/stub_edit +++ b/stubs/ui/stub/edit/stub_edit @@ -92,7 +92,7 @@ class _StubEditState extends State { body:Form( key: _formKey, child: Builder(builder: (BuildContext context) { - return ListView( + return ScrollableListView( children: [ FormCard( children: [ diff --git a/stubs/ui/stub/view/stub_view b/stubs/ui/stub/view/stub_view index 89e54b181..ca35a0331 100644 --- a/stubs/ui/stub/view/stub_view +++ b/stubs/ui/stub/view/stub_view @@ -27,7 +27,7 @@ class _StubViewState extends State { return ViewScaffold( isFilter: widget.isFilter, entity: stub, - body: ListView( + body: ScrollableListView( children: [ ], ),