【问题标题】:Flutter close child screen and navigate to another screen automaticallyFlutter 关闭子屏幕并自动导航到另一个屏幕
【发布时间】:2020-12-16 06:19:42
【问题描述】:

我正在使用底部标签导航,并且我的屏幕具有以下逻辑:

Screen A
 -> Button Open Screen B
 -> Button Open Screen C
Screen B
 -> Button Open Child Screen B
    -> Button Open Screen C

我可以使用widget.mainTabController.animateTo(1); 通过代码从Screen A 导航到Screen B,效果很好。

我现在需要的是在Child Screen B 关闭后从Screen B 导航到Screen A。

class ScreenB extends StatefulWidget {
  final TabController mainTabController;

  ScreenB(TabController mainTabController)
      : this.mainTabController = mainTabController;

  @override
  _State createState() => _State();
}

class _State extends State<ScreenB> 
{
    @override
    Widget build(BuildContext context) {
        // ...
        GridView.builder(
            // ...
            itemBuilder: (BuildContext context, int index)
            {
                Entry entry = this.entries[index];
                return entry.build(context);
            }
        );
    }
}

class Entry extends State<ScreenB>
{
    Widget build(BuildContext context) 
    {
        // ... 
        onTap: () async {
            // Opens the Screen B Child
            final result = await Navigator.push(
                context,
                MaterialPageRoute(
                    builder: (context) => ScreenBChild(),
                ),
            );
            
            // Should go back to Screen A but does nothing
            if (result)
                widget.mainTabController.animateTo(0);
        );
    }
}

屏幕“子屏幕B”关闭后,我回到Screen B和代码widget.mainTabController.animateTo(0),虽然被触发,但没有任何反应,屏幕没有变化。控制台中也不会抛出错误。

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    已解决。

    1. Entry 类必须转换为无状态(或有状态,如您所愿)类
    2. 该类应在其初始化时收到mainTabController
    3. 我们必须在触发动画移动到另一个屏幕之前应用延迟

    话虽如此,Entry 的调用方式如下:

    Entry entry = new Entry(mainTabController: widget.mainTabController);
    

    并且该类被转换为:

    class Entry extends StatelessWidget {
      final TabController mainTabController;
    
      Entry({Key key, this.mainTabController}) : super(key: key);
    
      @override
      Widget build(BuildContext context) 
      {
        // ...
        onTap: () async {
            final result = await Navigator.push(
                context,
                MaterialPageRoute(
                    builder: (context) => ScreenBChild(),
                ),
            );
            
            if (result)
            {
                await Future.delayed(Duration(milliseconds: 300), () => 
                { 
                    this.mainTabController.animateTo(0);
                });
            }           
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-06
      • 2020-07-25
      • 2019-02-22
      • 2010-11-09
      • 1970-01-01
      相关资源
      最近更新 更多