From a8606f18b655536a9baa86aa0fd71bb5bcc1a48d Mon Sep 17 00:00:00 2001 From: krille-chan Date: Sun, 31 Mar 2024 19:28:19 +0200 Subject: [PATCH] refactor: new flutter only typing animation --- assets/typing.gif | Bin 18879 -> 0 bytes assets/typing.svg | 80 -------------------------- lib/pages/chat/typing_indicators.dart | 75 +++++++++++++++++++++--- 3 files changed, 67 insertions(+), 88 deletions(-) delete mode 100644 assets/typing.gif delete mode 100644 assets/typing.svg diff --git a/assets/typing.gif b/assets/typing.gif deleted file mode 100644 index 7c8154721c87b6615ceb012e5079885b302462fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18879 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 - - - - - - - - - - - - - diff --git a/lib/pages/chat/typing_indicators.dart b/lib/pages/chat/typing_indicators.dart index b48f5f903..e816f465d 100644 --- a/lib/pages/chat/typing_indicators.dart +++ b/lib/pages/chat/typing_indicators.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:fluffychat/config/app_config.dart'; @@ -78,14 +80,8 @@ class TypingIndicators extends StatelessWidget { bottomRight: Radius.circular(AppConfig.borderRadius), ), child: Padding( - padding: const EdgeInsets.all(8), - child: typingUsers.isEmpty - ? null - : Image.asset( - 'assets/typing.gif', - height: 30, - filterQuality: FilterQuality.high, - ), + padding: const EdgeInsets.symmetric(horizontal: 8), + child: typingUsers.isEmpty ? null : const _TypingDots(), ), ), ), @@ -95,3 +91,66 @@ class TypingIndicators extends StatelessWidget { ); } } + +class _TypingDots extends StatefulWidget { + const _TypingDots(); + + @override + State<_TypingDots> createState() => __TypingDotsState(); +} + +class __TypingDotsState extends State<_TypingDots> { + int _tick = 0; + + late final Timer _timer; + + static const Duration animationDuration = Duration(milliseconds: 300); + + @override + void initState() { + _timer = Timer.periodic( + animationDuration, + (_) { + if (!mounted) { + return; + } + setState(() { + _tick = (_tick + 1) % 4; + }); + }, + ); + super.initState(); + } + + @override + void dispose() { + _timer.cancel(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + const size = 8.0; + + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + for (var i = 1; i <= 3; i++) + AnimatedContainer( + duration: animationDuration * 1.5, + curve: FluffyThemes.animationCurve, + width: size, + height: _tick == i ? size * 2 : size, + margin: EdgeInsets.symmetric( + horizontal: 2, + vertical: _tick == i ? 4 : 8, + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(size * 2), + color: Theme.of(context).colorScheme.secondary, + ), + ), + ], + ); + } +}