diff --git a/lib/screens/connect/connect.dart b/lib/screens/connect/connect.dart index 33e1e7c..ff55daf 100644 --- a/lib/screens/connect/connect.dart +++ b/lib/screens/connect/connect.dart @@ -1,12 +1,14 @@ -import 'package:expandable/expandable.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/rendering.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/appbar.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/app_config_provider.dart'; class Connect extends StatefulWidget { const Connect({Key? key}) : super(key: key); @@ -18,13 +20,38 @@ class Connect extends StatefulWidget { class _ConnectState extends State { List expandableControllerList = []; + late bool isVisible; + final ScrollController scrollController = ScrollController(); + void expandOrContract(int index) async { 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 Widget build(BuildContext context) { final serversProvider = Provider.of(context); + final appConfigProvider = Provider.of(context); for (var i = 0; i < serversProvider.serversList.length; i++) { expandableControllerList.add(ExpandableController()); @@ -32,12 +59,26 @@ class _ConnectState extends State { return Scaffold( appBar: const ConnectAppBar(), - body: ServersList( - context: context, - controllers: expandableControllerList, - onChange: expandOrContract + body: Stack( + children: [ + ServersList( + 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(), ); } } \ No newline at end of file diff --git a/lib/screens/servers/servers.dart b/lib/screens/servers/servers.dart index 49273f0..20f365a 100644 --- a/lib/screens/servers/servers.dart +++ b/lib/screens/servers/servers.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:expandable/expandable.dart'; +import 'package:flutter/rendering.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.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/providers/servers_provider.dart'; +import 'package:adguard_home_manager/providers/app_config_provider.dart'; class Servers extends StatefulWidget { const Servers({Key? key}) : super(key: key); @@ -18,13 +20,38 @@ class Servers extends StatefulWidget { class _ServersState extends State { List expandableControllerList = []; + late bool isVisible; + final ScrollController scrollController = ScrollController(); + void expandOrContract(int index) async { 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 Widget build(BuildContext context) { final serversProvider = Provider.of(context); + final appConfigProvider = Provider.of(context); for (var i = 0; i < serversProvider.serversList.length; i++) { expandableControllerList.add(ExpandableController()); @@ -43,17 +70,31 @@ class _ServersState extends State { appBar: AppBar( title: Text(AppLocalizations.of(context)!.servers), ), - body: ServersList( - context: context, - controllers: expandableControllerList, - onChange: expandOrContract - ), - floatingActionButton: FloatingActionButton( - onPressed: openAddServerModal, - child: Icon( - Icons.add, - color: Theme.of(context).primaryColor.computeLuminance() > 0.5 ? Colors.black : Colors.white, - ), + body: Stack( + children: [ + ServersList( + 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: FloatingActionButton( + onPressed: openAddServerModal, + child: Icon( + Icons.add, + color: Theme.of(context).primaryColor.computeLuminance() > 0.5 ? Colors.black : Colors.white, + ), + ), + ), + ], ), ); } diff --git a/lib/widgets/servers_list/servers_list.dart b/lib/widgets/servers_list/servers_list.dart index 55805d9..adcd43b 100644 --- a/lib/widgets/servers_list/servers_list.dart +++ b/lib/widgets/servers_list/servers_list.dart @@ -17,12 +17,14 @@ class ServersList extends StatefulWidget { final BuildContext context; final List controllers; final Function(int) onChange; + final ScrollController scrollController; const ServersList({ Key? key, required this.context, required this.controllers, - required this.onChange + required this.onChange, + required this.scrollController, }) : super(key: key); @override @@ -351,6 +353,7 @@ class _ServersListState extends State with SingleTickerProviderStat return servers.isNotEmpty ? ListView.builder( + controller: widget.scrollController, itemCount: servers.length, itemBuilder: (context, index) => Container( decoration: BoxDecoration(