首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在颤振导航2中,didPop到底在做什么?

在颤振导航2中,didPop到底在做什么?
EN

Stack Overflow用户
提问于 2021-02-04 18:03:27
回答 1查看 257关注 0票数 0

最小可复制代码:

代码语言:javascript
复制
void main() => runApp(FooApp());

class FooApp extends StatefulWidget {
  @override
  _FooAppState createState() => _FooAppState();
}

class _FooAppState extends State<FooApp> {
  bool _showPage2 = false;
  void _onPressed(bool value) => setState(() => _showPage2 = value);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Navigator(
        onPopPage: (route, result) => route.didPop(result),
        pages: [
          MaterialPage(child: Page1(onPressed: _onPressed)),
          if (_showPage2) MaterialPage(child: Page2()),
        ],
      ),
    );
  }
}

class Page1 extends StatelessWidget {
  final ValueChanged<bool> onPressed;
  const Page1({Key key, this.onPressed}) : super(key: key);

  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Page1')),
      body: ElevatedButton(
        onPressed: () => onPressed(true),
        child: Text('Page2'),
      ),
    );
  }
}

class Page2 extends StatefulWidget {
  @override
  _Page2State createState() => _Page2State();
}

class _Page2State extends State<Page2> {
  void dispose() {
    super.dispose();
    print('dispose'); 
  }

  Widget build(BuildContext context) => Scaffold(appBar: AppBar(title: Text('Page2')));
}

didPop:

当此函数返回true时,导航器将此路由从历史记录中移除,但尚未调用dispose。相反,调用NavigatorState.finalizeRoute是路由的责任,而后者又将在路由上调用dispose。此序列允许路由在弹出后但在被处理之前执行退出动画(或其他一些视觉效果)。

但在我的示例中,您可以看到无需在NavigatorState.finalizeRoute中调用Page2dispose方法确实会被调用为自相矛盾的文档。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-04 19:01:43

当使用MaterialPage/_PageBasedMaterialPageRoute时,它是在内部完成的。您可以在启动在Navigator类的代码中穿插,这似乎会导致班级。如果你真的想追踪你自己,那不是我在公园散步,你必须密切关注每一节课是如何相关的。

该类具有finishedWhenPopped getter,默认情况下它是true。如果您在getter定义下面查看didPop覆盖实现,当finishedWhenPopped为true时,didPop将在内部调用finalizeRoute

https://github.com/flutter/flutter/blob/1b310472c044a461dcfac823dca74f9b6359e4a7/packages/flutter/lib/src/widgets/navigator.dart实现

代码语言:javascript
复制
@protected
bool get finishedWhenPopped => true;

@override
bool didPop(T? result) {
  final bool returnValue = super.didPop(result);
  assert(returnValue);
  if (finishedWhenPopped)
    navigator!.finalizeRoute(this);
  return returnValue;
}

这只适用于至少MaterialPage/_PageBasedMaterialPageRoute。其他实现不一定会这样做。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66051297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档