From f9c1c3914eaada9fea700c565ac3171e9275d677 Mon Sep 17 00:00:00 2001 From: Adam Velebil Date: Tue, 18 Oct 2022 11:52:02 +0200 Subject: [PATCH] delay oath progressbar visibility --- lib/oath/views/oath_screen.dart | 7 ++- lib/widgets/delayed_visibility.dart | 66 +++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 lib/widgets/delayed_visibility.dart diff --git a/lib/oath/views/oath_screen.dart b/lib/oath/views/oath_screen.dart index c94e7cb8..7c5eb840 100755 --- a/lib/oath/views/oath_screen.dart +++ b/lib/oath/views/oath_screen.dart @@ -20,6 +20,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:yubico_authenticator/widgets/delayed_visibility.dart'; import '../../app/message.dart'; import '../../app/models.dart'; @@ -42,6 +43,7 @@ import 'unlock_form.dart'; class OathScreen extends ConsumerWidget { final DevicePath devicePath; + const OathScreen(this.devicePath, {super.key}); @override @@ -210,7 +212,10 @@ class _UnlockedViewState extends ConsumerState<_UnlockedView> { ); }, ) - : const CircularProgressIndicator(), + : const DelayedVisibility( + delay: Duration(milliseconds: 200), + child: CircularProgressIndicator(), + ), ), ); } diff --git a/lib/widgets/delayed_visibility.dart b/lib/widgets/delayed_visibility.dart new file mode 100644 index 00000000..e98e8a1d --- /dev/null +++ b/lib/widgets/delayed_visibility.dart @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2022 Yubico. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import 'dart:async'; + +import 'package:flutter/material.dart'; + +class DelayedVisibility extends StatefulWidget { + final Duration delay; + final Widget child; + + /// Makes child visible after delay + const DelayedVisibility( + {super.key, required this.delay, required this.child}); + + @override + State createState() => _DelayedVisibilityState(); +} + +class _DelayedVisibilityState extends State { + bool _visible = false; + Timer? _timer; + + @override + void initState() { + super.initState(); + _timer = Timer.periodic(widget.delay, (timer) { + if (mounted) { + setState(() { + _visible = true; + }); + } + timer.cancel(); + _timer = null; + }); + } + + @override + void dispose() { + super.dispose(); + _timer?.cancel(); + } + + @override + Widget build(BuildContext context) { + return Visibility( + visible: _visible, + maintainState: true, + maintainAnimation: true, + child: widget.child, + ); + } +}