Updated scroll screens

This commit is contained in:
Juan Gilsanz Polo 2023-09-04 23:32:55 +02:00
parent 31f5e045c8
commit a57a65f12a
2 changed files with 490 additions and 418 deletions

View file

@ -82,9 +82,8 @@ class LogDetailsScreen extends StatelessWidget {
}
}
Widget content() {
return ListView(
children: [
List<Widget> content() {
return [
SectionLabel(label: AppLocalizations.of(context)!.status),
LogListTile(
icon: Icons.shield_rounded,
@ -206,8 +205,7 @@ class LogDetailsScreen extends StatelessWidget {
)
)).toList()
]
],
);
];
}
if (dialog) {
@ -269,7 +267,9 @@ class LogDetailsScreen extends StatelessWidget {
Expanded(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8),
child: content(),
child: ListView(
children: content(),
)
),
)
],
@ -279,8 +279,15 @@ class LogDetailsScreen extends StatelessWidget {
}
else {
return Scaffold(
appBar: AppBar(
body: NestedScrollView(
headerSliverBuilder: (context, innerBoxIsScrolled) => [
SliverOverlapAbsorber(
handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),
sliver: SliverAppBar.large(
pinned: true,
floating: true,
centerTitle: false,
forceElevated: innerBoxIsScrolled,
title: Text(AppLocalizations.of(context)!.logDetails),
actions: [
IconButton(
@ -307,7 +314,25 @@ class LogDetailsScreen extends StatelessWidget {
const SizedBox(width: 10)
],
),
body: content(),
)
],
body: SafeArea(
top: false,
bottom: false,
child: Builder(
builder: (context) => CustomScrollView(
slivers: [
SliverOverlapInjector(
handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),
),
SliverList.list(
children: content()
)
],
),
)
)
),
);
}
}

View file

@ -192,7 +192,17 @@ class _LogsState extends State<Logs> {
Widget generateBody() {
switch (logsProvider.loadStatus) {
case LoadStatus.loading:
return SizedBox(
return SafeArea(
top: false,
bottom: false,
child: Builder(
builder: (context) => CustomScrollView(
slivers: [
SliverOverlapInjector(
handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),
),
SliverFillRemaining(
child: SizedBox(
width: double.maxFinite,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
@ -209,20 +219,25 @@ class _LogsState extends State<Logs> {
)
],
),
)
)
],
),
)
);
case LoadStatus.loaded:
return RefreshIndicator(
onRefresh: () async {
await logsProvider.fetchLogs(inOffset: 0);
},
child: logsProvider.logsData!.data.isNotEmpty
? ListView.builder(
controller: scrollController,
padding: const EdgeInsets.only(top: 0),
itemCount: logsProvider.isLoadingMore == true
? logsProvider.logsData!.data.length+1
: logsProvider.logsData!.data.length,
return SafeArea(
top: false,
bottom: false,
child: Builder(
builder: (context) => CustomScrollView(
slivers: [
SliverOverlapInjector(
handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),
),
if (logsProvider.logsData!.data.isNotEmpty) SliverList.builder(
itemCount: logsProvider.logsData!.data.length,
itemBuilder: (context, index) {
if (logsProvider.isLoadingMore == true && index == logsProvider.logsData!.data.length) {
return const Padding(
@ -255,8 +270,9 @@ class _LogsState extends State<Logs> {
return null;
}
}
)
: Center(
),
if (logsProvider.logsData!.data.isEmpty) SliverFillRemaining(
child: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
@ -284,11 +300,25 @@ class _LogsState extends State<Logs> {
),
]
),
),
)
],
),
)
);
case LoadStatus.error:
return SizedBox(
return SafeArea(
top: false,
bottom: false,
child: Builder(
builder: (context) => CustomScrollView(
slivers: [
SliverOverlapInjector(
handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),
),
SliverFillRemaining(
child: SizedBox(
width: double.maxFinite,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
@ -309,6 +339,11 @@ class _LogsState extends State<Logs> {
)
],
),
)
)
],
),
)
);
default:
@ -318,9 +353,18 @@ class _LogsState extends State<Logs> {
Widget logsScreen() {
return Scaffold(
appBar: AppBar(
title: Text(AppLocalizations.of(context)!.logs),
body: NestedScrollView(
headerSliverBuilder: (context, innerBoxIsScrolled) => [
SliverOverlapAbsorber(
handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),
sliver: SliverAppBar.large(
pinned: true,
floating: true,
centerTitle: false,
forceElevated: innerBoxIsScrolled,
title: Text(AppLocalizations.of(context)!.logs),
expandedHeight: logsProvider.appliedFilters.searchText != null || logsProvider.appliedFilters.selectedResultStatus != 'all' || logsProvider.appliedFilters.clients != null
? 170 : null,
actions: [
if (!(Platform.isAndroid || Platform.isIOS)) IconButton(
onPressed: () => logsProvider.fetchLogs(inOffset: 0),
@ -369,7 +413,7 @@ class _LogsState extends State<Logs> {
],
bottom: logsProvider.appliedFilters.searchText != null || logsProvider.appliedFilters.selectedResultStatus != 'all' || logsProvider.appliedFilters.clients != null
? PreferredSize(
preferredSize: const Size(double.maxFinite, 50),
preferredSize: const Size(double.maxFinite, 70),
child: Container(
height: 50,
width: double.maxFinite,
@ -494,7 +538,10 @@ class _LogsState extends State<Logs> {
)
: null,
),
)
],
body: generateBody()
),
);
}