Fab changes

This commit is contained in:
Juan Gilsanz Polo 2022-10-29 19:25:58 +02:00
parent 2ee2eafdca
commit 8907e712f3
3 changed files with 103 additions and 18 deletions

View file

@ -1,12 +1,14 @@
import 'package:expandable/expandable.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:expandable/expandable.dart';
import 'package:adguard_home_manager/screens/connect/fab.dart'; import 'package:adguard_home_manager/screens/connect/fab.dart';
import 'package:adguard_home_manager/screens/connect/appbar.dart'; import 'package:adguard_home_manager/screens/connect/appbar.dart';
import 'package:adguard_home_manager/widgets/servers_list/servers_list.dart'; import 'package:adguard_home_manager/widgets/servers_list/servers_list.dart';
import 'package:adguard_home_manager/providers/servers_provider.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart';
import 'package:adguard_home_manager/providers/app_config_provider.dart';
class Connect extends StatefulWidget { class Connect extends StatefulWidget {
const Connect({Key? key}) : super(key: key); const Connect({Key? key}) : super(key: key);
@ -18,13 +20,38 @@ class Connect extends StatefulWidget {
class _ConnectState extends State<Connect> { class _ConnectState extends State<Connect> {
List<ExpandableController> expandableControllerList = []; List<ExpandableController> expandableControllerList = [];
late bool isVisible;
final ScrollController scrollController = ScrollController();
void expandOrContract(int index) async { void expandOrContract(int index) async {
expandableControllerList[index].expanded = !expandableControllerList[index].expanded; expandableControllerList[index].expanded = !expandableControllerList[index].expanded;
} }
@override
void initState() {
super.initState();
isVisible = true;
scrollController.addListener(() {
if (scrollController.position.userScrollDirection == ScrollDirection.reverse) {
if (mounted && isVisible == true) {
setState(() => isVisible = false);
}
}
else {
if (scrollController.position.userScrollDirection == ScrollDirection.forward) {
if (mounted && isVisible == false) {
setState(() => isVisible = true);
}
}
}
});
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context); final serversProvider = Provider.of<ServersProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
for (var i = 0; i < serversProvider.serversList.length; i++) { for (var i = 0; i < serversProvider.serversList.length; i++) {
expandableControllerList.add(ExpandableController()); expandableControllerList.add(ExpandableController());
@ -32,12 +59,26 @@ class _ConnectState extends State<Connect> {
return Scaffold( return Scaffold(
appBar: const ConnectAppBar(), appBar: const ConnectAppBar(),
body: ServersList( body: Stack(
context: context, children: [
controllers: expandableControllerList, ServersList(
onChange: expandOrContract context: context,
controllers: expandableControllerList,
onChange: expandOrContract,
scrollController: scrollController,
),
AnimatedPositioned(
duration: const Duration(milliseconds: 100),
curve: Curves.easeInOut,
bottom: isVisible ?
appConfigProvider.showingSnackbar
? 70 : 20
: -70,
right: 20,
child: const FabConnect()
)
],
), ),
floatingActionButton: const FabConnect(),
); );
} }
} }

View file

@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:expandable/expandable.dart'; import 'package:expandable/expandable.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -7,6 +8,7 @@ import 'package:adguard_home_manager/widgets/servers_list/servers_list.dart';
import 'package:adguard_home_manager/widgets/add_server_modal.dart'; import 'package:adguard_home_manager/widgets/add_server_modal.dart';
import 'package:adguard_home_manager/providers/servers_provider.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart';
import 'package:adguard_home_manager/providers/app_config_provider.dart';
class Servers extends StatefulWidget { class Servers extends StatefulWidget {
const Servers({Key? key}) : super(key: key); const Servers({Key? key}) : super(key: key);
@ -18,13 +20,38 @@ class Servers extends StatefulWidget {
class _ServersState extends State<Servers> { class _ServersState extends State<Servers> {
List<ExpandableController> expandableControllerList = []; List<ExpandableController> expandableControllerList = [];
late bool isVisible;
final ScrollController scrollController = ScrollController();
void expandOrContract(int index) async { void expandOrContract(int index) async {
expandableControllerList[index].expanded = !expandableControllerList[index].expanded; expandableControllerList[index].expanded = !expandableControllerList[index].expanded;
} }
@override
void initState() {
super.initState();
isVisible = true;
scrollController.addListener(() {
if (scrollController.position.userScrollDirection == ScrollDirection.reverse) {
if (mounted && isVisible == true) {
setState(() => isVisible = false);
}
}
else {
if (scrollController.position.userScrollDirection == ScrollDirection.forward) {
if (mounted && isVisible == false) {
setState(() => isVisible = true);
}
}
}
});
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context); final serversProvider = Provider.of<ServersProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
for (var i = 0; i < serversProvider.serversList.length; i++) { for (var i = 0; i < serversProvider.serversList.length; i++) {
expandableControllerList.add(ExpandableController()); expandableControllerList.add(ExpandableController());
@ -43,17 +70,31 @@ class _ServersState extends State<Servers> {
appBar: AppBar( appBar: AppBar(
title: Text(AppLocalizations.of(context)!.servers), title: Text(AppLocalizations.of(context)!.servers),
), ),
body: ServersList( body: Stack(
context: context, children: [
controllers: expandableControllerList, ServersList(
onChange: expandOrContract context: context,
), controllers: expandableControllerList,
floatingActionButton: FloatingActionButton( onChange: expandOrContract,
onPressed: openAddServerModal, scrollController: scrollController
child: Icon( ),
Icons.add, AnimatedPositioned(
color: Theme.of(context).primaryColor.computeLuminance() > 0.5 ? Colors.black : Colors.white, duration: const Duration(milliseconds: 100),
), curve: Curves.easeInOut,
bottom: isVisible ?
appConfigProvider.showingSnackbar
? 70 : 20
: -70,
right: 20,
child: FloatingActionButton(
onPressed: openAddServerModal,
child: Icon(
Icons.add,
color: Theme.of(context).primaryColor.computeLuminance() > 0.5 ? Colors.black : Colors.white,
),
),
),
],
), ),
); );
} }

View file

@ -17,12 +17,14 @@ class ServersList extends StatefulWidget {
final BuildContext context; final BuildContext context;
final List<ExpandableController> controllers; final List<ExpandableController> controllers;
final Function(int) onChange; final Function(int) onChange;
final ScrollController scrollController;
const ServersList({ const ServersList({
Key? key, Key? key,
required this.context, required this.context,
required this.controllers, required this.controllers,
required this.onChange required this.onChange,
required this.scrollController,
}) : super(key: key); }) : super(key: key);
@override @override
@ -351,6 +353,7 @@ class _ServersListState extends State<ServersList> with SingleTickerProviderStat
return servers.isNotEmpty ? return servers.isNotEmpty ?
ListView.builder( ListView.builder(
controller: widget.scrollController,
itemCount: servers.length, itemCount: servers.length,
itemBuilder: (context, index) => Container( itemBuilder: (context, index) => Container(
decoration: BoxDecoration( decoration: BoxDecoration(