refactor: console page updates

pull/444/head
Aliaksei Tratseuski 2024-02-05 14:42:05 +04:00 committed by aliaksei tratseuski
parent 8015e47617
commit dd9e8876e0
1 changed files with 28 additions and 19 deletions

View File

@ -1,8 +1,7 @@
import 'dart:collection';
import 'package:auto_route/auto_route.dart'; import 'package:auto_route/auto_route.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gap/gap.dart';
import 'package:selfprivacy/config/get_it_config.dart'; import 'package:selfprivacy/config/get_it_config.dart';
import 'package:selfprivacy/logic/models/message.dart'; import 'package:selfprivacy/logic/models/message.dart';
import 'package:selfprivacy/ui/components/list_tiles/log_list_tile.dart'; import 'package:selfprivacy/ui/components/list_tiles/log_list_tile.dart';
@ -16,25 +15,36 @@ class ConsolePage extends StatefulWidget {
} }
class _ConsolePageState extends State<ConsolePage> { class _ConsolePageState extends State<ConsolePage> {
bool paused = false;
@override @override
void initState() { void initState() {
getIt.get<ConsoleModel>().addListener(update);
super.initState(); super.initState();
getIt<ConsoleModel>().addListener(update);
} }
@override @override
void dispose() { void dispose() {
getIt<ConsoleModel>().removeListener(update); getIt<ConsoleModel>().removeListener(update);
super.dispose(); super.dispose();
} }
bool paused = false;
void update() { void update() {
if (!paused) { /// listener update could come at any time, like when widget is already
setState(() => {}); /// 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 @override
@ -51,7 +61,7 @@ class _ConsolePageState extends State<ConsolePage> {
icon: Icon( icon: Icon(
paused ? Icons.play_arrow_outlined : Icons.pause_outlined, paused ? Icons.play_arrow_outlined : Icons.pause_outlined,
), ),
onPressed: () => setState(() => paused = !paused), onPressed: togglePause,
), ),
], ],
), ),
@ -69,12 +79,12 @@ class _ConsolePageState extends State<ConsolePage> {
reverse: true, reverse: true,
shrinkWrap: true, shrinkWrap: true,
children: [ children: [
const SizedBox(height: 20), const Gap(20),
...UnmodifiableListView( ...messages.reversed.map(
messages (final message) => LogListItem(
.map((final message) => LogListItem(message: message)) key: ValueKey(message),
.toList() message: message,
.reversed, ),
), ),
], ],
); );
@ -82,11 +92,10 @@ class _ConsolePageState extends State<ConsolePage> {
return Column( return Column(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [ children: [
Text('console_page.waiting'.tr()), Text('console_page.waiting'.tr()),
const SizedBox( const Gap(16),
height: 16,
),
const CircularProgressIndicator(), const CircularProgressIndicator(),
], ],
); );