Когда я запускаю следующий код, при входе пользователя в систему AnimatedBackground() успешно анимируется, и страница изменяется с LoginScreen() на HomeScreen(), однако при переходе анимации нет.
Я подозреваю, что это как-то связано с вложенными анимациями и перестроениями в неподходящее время, но это не было исправлено ключами.
class AuthenticationWrapper extends StatelessWidget {
@override
Widget build(BuildContext context) {
final User? firebaseuser = context.watch<User?>();
print("build run with user $firebaseuser");
return SafeArea(
child: AnimatedBackground(
key: Key("salt123value${firebaseuser == null}"),
animate: firebaseuser == null ? false : true,
child: AnimatedSwitcher(
key: Key("animatedswitcher"),
transitionBuilder: AnimatedSwitcher.defaultTransitionBuilder,
duration: const Duration(seconds: 4),
child: firebaseuser == null
? LoginScreen(
key: Key("login"),
)
: HomeScreen(
key: Key("home"),
)),
));
}
}
NB AnimatedBackground — это настраиваемый виджет, который возвращает либо CustomPaint(child:child), либо CustomPaint внутри и AnimatedBuilder.
Может быть, это связано с тем, что AnimatedBckground (animate: bool) возвращает разную глубину дерева виджетов в зависимости от значения animate?
Так что, в конце концов, обертка AnimatedSwticher.defaultLayoutBuilder
в моем анимированном виджете сработала.
class AuthenticationWrapper extends StatelessWidget {
@override
Widget build(BuildContext context) {
final User? firebaseuser = context.watch<User?>();
return SafeArea(
child: AnimatedSwitcher(
layoutBuilder: (currentChild, previousChildren) =>
AnimatedBackground(
key: ValueKey<String>(firebaseuser?.uid.toString() ?? "none"),
animate: firebaseuser != null,
child: AnimatedSwitcher.defaultLayoutBuilder(
currentChild, previousChildren),
),
duration: const Duration(seconds: 1),
child: firebaseuser == null ? LoginScreen() : HomeScreen()));
}
}
Таким образом, и моя анимация, и анимация AnimatedSwitcher работали, не влияя друг на друга.
К вашему сведению: вы можете использовать
firebaseuser != null
вместоfirebaseuser == null ? false : true