| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 | import 'package:app_flowy/startup/startup.dart';import 'package:app_flowy/workspace/domain/page_stack/page_stack.dart';import 'package:flowy_log/flowy_log.dart';import 'package:flutter/material.dart';import 'package:time/time.dart';// [[diagram: HomeStack's widget structure]]////                                                               ┌──────────────────┐   ┌───────────────┐//                                                            ┌──│BlankStackContext │──▶│BlankStackPage │// ┌──────────┐  ┌───────────────────┐   ┌─────────────────┐  │  └──────────────────┘   └───────────────┘// │HomeStack │─▶│ HomeStackManager  │──▶│HomeStackContext │◀─┤// └──────────┘  └───────────────────┘   └─────────────────┘  │  ┌─────────────────┐    ┌────────────┐//                                                            └──│ DocStackContext │───▶│DocStackPage│//                                                               └─────────────────┘    └────────────┘////class HomeStack extends StatelessWidget {  static GlobalKey<ScaffoldState> scaffoldKey = GlobalKey();  // final Size size;  const HomeStack({Key? key}) : super(key: key);  @override  Widget build(BuildContext context) {    Log.info('HomePage build');    return Column(      mainAxisAlignment: MainAxisAlignment.start,      children: [        getIt<HomeStackManager>().stackTopBar(),        Expanded(          child: Container(            color: Colors.white,            child: FocusTraversalGroup(              child: getIt<HomeStackManager>().stackWidget(),            ),          ),        ),      ],    );  }}class FadingIndexedStack extends StatefulWidget {  final int index;  final List<Widget> children;  final Duration duration;  const FadingIndexedStack({    Key? key,    required this.index,    required this.children,    this.duration = const Duration(      milliseconds: 250,    ),  }) : super(key: key);  @override  _FadingIndexedStackState createState() => _FadingIndexedStackState();}class _FadingIndexedStackState extends State<FadingIndexedStack> {  double _targetOpacity = 1;  @override  void didUpdateWidget(FadingIndexedStack oldWidget) {    if (oldWidget.index == widget.index) return;    setState(() => _targetOpacity = 0);    Future.delayed(1.milliseconds, () => setState(() => _targetOpacity = 1));    super.didUpdateWidget(oldWidget);  }  @override  Widget build(BuildContext context) {    return TweenAnimationBuilder<double>(      duration: _targetOpacity > 0 ? widget.duration : 0.milliseconds,      tween: Tween(begin: 0, end: _targetOpacity),      builder: (_, value, child) {        return Opacity(opacity: value, child: child);      },      child: IndexedStack(index: widget.index, children: widget.children),    );  }}
 |