首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在Flutter中的子控件中按下back按钮后不调用didChangeDependencies()?

在Flutter中,当按下返回按钮时,会触发页面的didChangeDependencies()方法。如果你想在子控件中按下返回按钮后不调用didChangeDependencies(),可以通过以下步骤实现:

  1. 创建一个自定义的子控件类,继承自StatefulWidget
  2. 在子控件的状态类中,重写didChangeDependencies()方法,并留空。
  3. 在子控件的状态类中,重写didUpdateWidget()方法,并在其中判断是否按下了返回按钮。
  4. 如果按下了返回按钮,则在didUpdateWidget()方法中执行你想要的操作,而不是在didChangeDependencies()方法中执行。

以下是一个示例代码:

代码语言:txt
复制
import 'package:flutter/material.dart';

class MyWidget extends StatefulWidget {
  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  @override
  void didChangeDependencies() {
    // 留空,不执行任何操作
  }

  @override
  void didUpdateWidget(MyWidget oldWidget) {
    super.didUpdateWidget(oldWidget);
    // 判断是否按下了返回按钮
    if (ModalRoute.of(context)?.willPopScope == true) {
      // 执行你想要的操作
      // ...
    }
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      // 子控件的内容
    );
  }
}

通过以上步骤,你可以在子控件中按下返回按钮后不调用didChangeDependencies()方法,并在didUpdateWidget()方法中执行你想要的操作。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Flutter | 基础Widget

此方法是 Flutter FrameWork 隐式调用,在我们开发过程基本不会调用到。...被改变时,可以手动调用 setState() 方法通知 Flutter framework 状态发生改变,flutter framework 收到消息,会调用其 build 方法重新构建 widget...Widget 第一次插入到树 Widget 时调用,对于每一个 State 对象,Flutter framework 只会调用一次该回调,所以通常在该回调做一些一次性操作,状态初始化,订阅子树时间通知等...也可以会发生变化,所以正确做法应该是在 build 方法或者 didChangeDependencies 调用didChangeDependencies() 当 State 对象依赖发生变化时会被调用...,用来观察一生命周期变化 1,首先,打开这个页面,查看输出 I/flutter ( 6725): initState:初始化 I/flutter ( 6725): didChangeDependencies

1.2K20

Flutter跨平台移动端开发丨WillPopScope、InheritedWidget、Theme

WillPopScope(返回事件拦截器) InheritedWidget(数据传递与共享) Theme (主题控制) ---- WillPopScope(返回事件拦截器) 可防止误触情况发生,也可监听返回按钮点击事件...= null), super(key: key); onWillPop:返回事件回调函数,点击返回按钮调用。...此回调方法返回 true 时退出,返回 false 时不会退出 child:元素 import 'package:flutter/material.dart'; /** * @des WillPopScope...---- Theme (主题控制) 通过 ThemeData 可以控制 Theme 视图内组件风格,颜色、字体、样式等,实际上也是通过 InheritedWidget 来共享与传递主题数据 const...Color dividerColor, // 分割线颜色 ButtonThemeData buttonTheme, // 按钮主题 Color cursorColor, // 输入框光标的颜色

1.3K30

使用InheritedWidget来进行状态管理

比如在主题、locale(语言)等发生变化时候,依赖其widgetdidChangeDependencies方法将会被调用。...,并且控制台会打印出一句日志: Dependencies change 由此可见,widgetstate依赖发生变化,其didChangeDependencies函数将会被调用。...Increment按钮,ShareDataWidgetdata虽然发生变化,但是__TestWidgetState并未依赖ShareDataWidget,所以__TestWidgetStatedidChangeDependencies...,点击"Increment"按钮,会发现__TestWidgetStatedidChangeDependencies()方法确实不会再被调用,但是其build()仍然会被调用!...造成这个原因其实是,点击"Increment"按钮,会调用_InheritedWidgetTestRouteStatesetState()方法,此时会重新构建整个页面,由于示例,__TestWidget

42020

Flutter入门三部曲(3) - 数据传递状态管理

然后从这个类,去调用获取状态方法。(Android开发同学应该很熟悉套路,类似Picasso、Glide)。但事实上是这样吗?...然后在子树任何地方,都可以通过这样方式来进行获取。 定义一个AppState 了解了MediaQuery存放方式,我们可以实现自己状态管理,这样在组件,就可以同步获取到状态值。...回调用就是延迟5s,将result修改成 "From delay" listener = () { Future.delayed(Duration(seconds: 5)).then...这样子树本身可以直接传入这个字段(这样可以避免多级Widget时,要一层一层向下传递状态) 还可以做不同Widget中间状态同步 ChangeNofier 继承这里类,我们就可以实现Flutter...闲鱼flutter界面框架设计.png 从上往下: 通过自定义不同ScopeInheritedWidget来hold住不同Scope数据,这样当前Scope组件都能得到对应数据,和得到对应更新

3.7K51

Flutter —生命周期

##Flutter 生命周期 flutter 也有自己生命周期,但跟 Android 比起来就显得弱化了,官方定义生命周期只有五个,实际应用还需要WidgetsBindingObserver接口配合...didChangeDependencies() 在 initState() 之后调用,当 State 对象依赖关系发生变化时,该方法被调用,初始化时也会调用。...[flutter - 生命周期] 常见业务场景: 1.Widget A打开Widget B: 调用 Navigator.push(B) B构造函数--->B initState--->B didChangeDependencies...didChangeDependencies--->A build--->B deactivate--->B dispose 可以看出, Flutter打开、关闭Widget时跟安卓、iOS时序一样,...回调;同安卓onStop; 4、suspending, iOS没用,安卓里就是挂起,不会再执行 drawframe 回调; 下面是生命周期: 1、初次打开widget时,执行AppLifecycleState

1.3K20

Flutter | 数据共享

Flutter Framework 调用,这个依赖指就是 widget 是否使用了父 widget InheritedWidget 数据; 使用了,则代表该组件依赖 InheritedWidget...这种机制可以使组件所依赖 InheritedWidget 在变化时来更新自身,例如主题,等发生变化时候,依赖 widget didChangeDependencies 方法就会被调用 下面看一个栗子...//返回true:则子树依赖当前 widget widget didChangeDependencies 会被调用 return oldWidget.data !...方法做什么 一般来说, widget 会很少重新此方法,应为在依赖发生改变之后也会调用 build 方法。...Flutter 社区著名 Provider 包正是基于这个思想实现一套跨组件状态共享解决方案,下面我们便详细看一 Provider 用法和原理。

1.3K30

FlutterFlutter 页面生命周期 ( 初始化期 | createState | initState | 更新期 | build | 销毁期 | dispose)

Widget 组件时除构造方法之外第一个方法 , 对应方法 : 对应 Android onCreate 方法 ; 对应 iOS viewDidLoad 方法 ; 常用用法 : 在该方法执行一些初始化操作...更新期生命周期函数 /// 方法调用时机 : /// ① 调用didChangeDependencies 方法调用该方法 /// ② 调用 setState 方法之后 , 该方法也会被调用...更新期生命周期函数 /// 方法调用时机 : /// ① 调用didChangeDependencies 方法调用该方法 /// ② 调用 setState 方法之后 , 该方法也会被调用...(); print("dispose"); } } 运行效果 : 打印日志 : 进入界面 , 点击 3 按钮 , 然后退出界面 ; 进入界面 : 先调用 initState 方法...I/flutter (21393): build 点击按钮 : 每次点击按钮都打印一次 build , 总共调用了 3 次 build 方法 ; I/flutter (21393): build

2.9K00

Flutter入门三部曲(3) - 数据传递状态管理

然后从这个类,去调用获取状态方法。(Android开发同学应该很熟悉套路,类似Picasso、Glide)。但事实上是这样吗?...然后在子树任何地方,都可以通过这样方式来进行获取。 定义一个AppState 了解了MediaQuery存放方式,我们可以实现自己状态管理,这样在组件,就可以同步获取到状态值。...回调用就是延迟5s,将result修改成 "From delay" listener = () { Future.delayed(Duration(seconds: 5)).then...这样子树本身可以直接传入这个字段(这样可以避免多级Widget时,要一层一层向下传递状态) 还可以做不同Widget中间状态同步 ChangeNofier 继承这里类,我们就可以实现Flutter...[闲鱼flutter界面框架设计.png] 从上往下: 通过自定义不同ScopeInheritedWidget来hold住不同Scope数据,这样当前Scope组件都能得到对应数据,和得到对应更新

1.2K00

Flutter技术与实战(4)

didChangeDependencies 则用来专门处理 State 对象依赖关系变化,会在 initState() 调用结束,被 Flutter 调用。 build,作用是构建视图。...didChangeDependencies:State 对象依赖关系发生变化Flutter 会回调这个方法,随后触发组件构建。哪些情况 State 对象依赖关系会发生变化呢?...值得注意是,页面切换时,由于 State 对象在视图树位置发生了变化,需要先暂时移除再重新添加,重新触发组件构建,因此这个函数也会被调用。...这就对应着按钮控件两个最重要参数了: onPressed 参数用于设置点击回调,告诉 Flutter按钮被点击时通知我们。...如果 onPressed 参数为空,则按钮会处于禁用状态,不响应用户点击。 child 参数用于设置按钮内容,告诉 Flutter 控件应该长成什么样,也就是控制着按钮控件基本样式。

10.7K20

Flutter跨平台移动端开发丨Widget、Element、State、状态管理

一个 widget 通常由一些低级别的 widget 组成,flutter 框架依次构建这些低级别的 widget,直到构建到最底层 widget 时,它会计算并描述 widget 几何形状 flutter...Stack:取代线性布局,与 Android FrameLayout相似,允许 widget 堆叠,使用 positioned 定位它们相对于上下左右四条边位置。...State 生命周期 initState:当前 widget 对象插入 widget树调用 didChangeDependencies:当前 State 对象依赖项发生变化时调用 build:绘制当前界面布局时调用.../flutter (28866): State 创建 - initState I/flutter (28866): State 更改 - didChangeDependencies I/flutter...didUpdateWidget I/flutter (28866): widget 绘制 - build 更改路由(移除当前 widget)使用热重载时 I/flutter (28866): 热重载

1.7K50

【源码分析】系列之 InheritedWidget

通常App会有登录用户信息,登录用户信息为全局共享信息,想象一组件要如何获取登录用户信息?将上面的场景抽象一,有一颗组件树,A、H 组件依赖同一数据,如下: A、H 组件要如何获取到数据呢?...运行效果: 下面修改数据并刷新UI,下面的代码仅能用于Demo,是为了演示方便,千万不要用于实际项目,因为下面的写法有巨大性能问题,因为重建了 InheritedWidget 组件所有组件,重要事情说...: A build flutter: F didChangeDependencies flutter: F build 因此,依赖 MyInheritedWidget 组件 F 组件调用 didChangeDependencies...flutter: F didChangeDependencies flutter: F build 实际返回了 true,因为前后 _userInfo 对象引用发生了变化,在 UserInfo 重写...,执行组件 didChangeDependencies 方法。

1K20

Flutter

Flutter 通过控件每个控件创建不同类型渲染对象,组成渲染对象树。而渲染对象树在 Flutter 展示过程分为四个阶段:布局、绘制、合成和渲染。...绘制 布局完成,渲染对象树每个节点都有了明确尺寸和位置。Flutter 会把所有的渲染对象绘制到不同图层上。与布局过程一样,绘制过程也是深度优先遍历,而且总是先绘制自身,再绘制节点。...didChangeDependencies 则用来专门处理 State 对象依赖关系变化,会在 initState() 调用结束,被 Flutter 调用。 build,作用是构建视图。...setState:我们最熟悉方法之一。当状态数据发生变化时,我们总是通过调用这个方法告诉 Flutter:“我这儿数据变啦,请使用更新数据重建 UI!”...值得注意是,页面切换时,由于 State 对象在视图树位置发生了变化,需要先暂时移除再重新添加,重新触发组件构建,因此这个函数也会被调用

1.9K40

Flutter 如何跨组件传递数据

InheritedWidget InheritedWidget 是 Flutter 中非常重要一个功能型 Widget,它可以高效将数据在Widget 树向下传递、共享,这在一些需要在 Widget...树中共享数据场景中非常方便, Flutter ,正是通过 InheritedWidget 来共享应用主题( Theme )和 Locale (当前语言环境)信息。...假如我们 Widget 要往 Widget3 传值,一般情况我们是这么写。一层一层传值,这样写十分麻烦。...//widget`state.didChangeDependencies`会被调用 return old.data !...这样数据传递机制适用于 Widget 状态变更,发送通知上报场景。 Flutter 中将这种由向父传递通知机制称为通知冒泡(Notification Bubbling)。

2.7K10

Flutter》-- 4.Flutter组件基础

didChangeDependencies():用来处理状态组件依赖关系变化,会在initState()调用结束调用。 build():用于构建视图。...didChangeDependencies():状态组件依赖关系发生变化Flutter会回调该函数,随后触发组件构建操作。...4.3.2 按钮组件 Materail组件库中常见按钮组件: RaisedButton:默认是带有阴影和灰色背景按钮阴影会变大; FlatButton:默认是背景透明并不带阴影按钮后会有背景色...; OutlineButton:默认是一个带有边框、不带阴影且背景透明按钮后边框颜色会变亮,同时会出现背景和阴影效果; IconButton:一个可点击图标按钮,不支持文字,默认没有背景,点击后会出现背景...所有Materail组件库按钮都有两个相同点:一是时会有水波动画,另一个是都有一个onPressed属性来设置单击回调。

12.4K30

Flutter框架分析(三)-- Widget,Element和RenderObject

后续我会在另外文章里从这个点出发,给大家说说渲染流水线如何在Widget、Element和RenderObject架构运行。...函数deactivate()在State对应Element被从树移除调用,这个移除可能是暂时移除。...函数dispose()在State对应Element被从树移除调用,这个移除是永久移除。 函数build(BuildContext context),大家很熟悉了,不多说了。...其内部实现主要是在维护对其有依赖ElementMap,以及在需要时候调用Element对应didChangeDependencies()回调,这里就不贴代码了,大家感兴趣的话可以自己去看一源码...Flutter渲染流水线构建(build)阶段主要就是在维护更新element tree里面的Element节点。

1.2K10
领券