From dd9e8876e0f185b0d7278c996546b5c0781312cd Mon Sep 17 00:00:00 2001 From: Aliaksei Tratseuski Date: Mon, 5 Feb 2024 14:42:05 +0400 Subject: [PATCH] refactor: console page updates --- lib/ui/pages/more/console.dart | 47 ++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/lib/ui/pages/more/console.dart b/lib/ui/pages/more/console.dart index dc3801a7..94c06b4d 100644 --- a/lib/ui/pages/more/console.dart +++ b/lib/ui/pages/more/console.dart @@ -1,8 +1,7 @@ -import 'dart:collection'; - import 'package:auto_route/auto_route.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; +import 'package:gap/gap.dart'; import 'package:selfprivacy/config/get_it_config.dart'; import 'package:selfprivacy/logic/models/message.dart'; import 'package:selfprivacy/ui/components/list_tiles/log_list_tile.dart'; @@ -16,25 +15,36 @@ class ConsolePage extends StatefulWidget { } class _ConsolePageState extends State { + bool paused = false; + @override void initState() { - getIt.get().addListener(update); - super.initState(); + + getIt().addListener(update); } @override void dispose() { getIt().removeListener(update); + super.dispose(); } - bool paused = false; - void update() { - if (!paused) { - setState(() => {}); - } + /// listener update could come at any time, like when widget is already + /// unmounted or during frame build, adding as postframe callback ensures + /// that element is marked for rebuild + WidgetsBinding.instance.addPostFrameCallback((final _) { + if (!paused && mounted) { + setState(() => {}); + } + }); + } + + void togglePause() { + paused ^= true; + setState(() {}); } @override @@ -51,7 +61,7 @@ class _ConsolePageState extends State { icon: Icon( paused ? Icons.play_arrow_outlined : Icons.pause_outlined, ), - onPressed: () => setState(() => paused = !paused), + onPressed: togglePause, ), ], ), @@ -69,12 +79,12 @@ class _ConsolePageState extends State { reverse: true, shrinkWrap: true, children: [ - const SizedBox(height: 20), - ...UnmodifiableListView( - messages - .map((final message) => LogListItem(message: message)) - .toList() - .reversed, + const Gap(20), + ...messages.reversed.map( + (final message) => LogListItem( + key: ValueKey(message), + message: message, + ), ), ], ); @@ -82,11 +92,10 @@ class _ConsolePageState extends State { return Column( mainAxisAlignment: MainAxisAlignment.center, mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Text('console_page.waiting'.tr()), - const SizedBox( - height: 16, - ), + const Gap(16), const CircularProgressIndicator(), ], );