第八十二回:Widget的生命周期

文章介绍了Flutter中StatefulWidget的生命周期,包括initState()用于初始化,build()用于构建Widget,以及dispose()用于释放资源。通过示例代码展示了这三个关键生命周期方法的使用,并提示读者可以结合Android或iOS的生命周期知识进行对比理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


我们在上一章回中介绍了Flutter中如何使用三方包相关的内容,本章回中将介绍 Widget的生命周期.闲话休提,让我们一起Talk Flutter吧。

概念介绍

本章回中介绍的生命周期是指Widget从创建到结果的整个过程,这里提到的Widget是一个泛称,更加准确的说是StatefulWidget,因为StatelessWidget没有具体的State

在程序开发过程中需要明白Widget的生命周期,这样才能生命周期中不同的阶段做不同的事情,常见是在创建Widget时初始化某些数据,在销毁Widget时释放相关的资源。

使用方法

生命周期是一个抽象的概念,不容易操作,不过不用担心,Flutter在生命周期中不同的阶段提供了不同的回调方法,我们称其为生命周期回调方法。我们只需要使用生命周期回调方法就可以去完全生命中相关的操作。接下来我们介绍相关的生命周期方法:

  • initState()方法:主要用来初始化Widget相关的内容;
  • build()方法:主要用来创建Widget,它不可以创建子Widget;
  • dispose()方法:主要用来释放Widget相关的资源;

我们在这里只介绍了三个重要的生命周期方法,其它的生命周期方法先不介绍,后续遇到后再做详细介绍。如果看官们有Android或者IOS的开发经验,那么可以使用这两个平台中生命周期的概念来对比,以及这两个平台中相关的的生命周期回调方法来做对比,比如onCreate,onResume,willApper,DidLoad等生命周期方法。

示例代码


class ExLoadingPage extends StatefulWidget {
  const ExLoadingPage({Key? key}) : super(key: key);

  
  State<ExLoadingPage> createState() => _ExLoadingPageState();
}

class _ExLoadingPageState extends State<ExLoadingPage> {
  
  void initState() {
    // TODO: implement initState
    super.initState();
    print("Widget Circle: initState");
  }

  
  Widget build(BuildContext context) {
    print("Widget Circle: build");

    return Container(
      child: Image.asset("images/ex.png"),
    );
  }

  
  void dispose() {
    print("Widget Circle: dispose");
    super.dispose();
  }
}

编译并且运行上面的程序可以得到以下运行结果。注意:在运行过程中需要使用路由来切换页面,不然无法走到dispose这个生命周期方法中:

I/flutter ( 9836): Widget Circle: initState
I/flutter ( 9836): Widget Circle: build
I/flutter ( 9836): Widget Circle: dispose

看官们,关于"Widget生命周期"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!

setState() or markNeedsBuild() called when widget tree was locked. This BetterPlayerSubtitlesDrawer widget cannot be marked as needing to build because the framework is locked. The widget on which setState() or markNeedsBuild() was called was: BetterPlayerSubtitlesDrawer state: _BetterPlayerSubtitlesDrawerState#42f65 When the exception was thrown, this was the stack: #0 Element.markNeedsBuild.<anonymous closure> (package:flutter/src/widgets/framework.dart:5193:9) #1 Element.markNeedsBuild (package:flutter/src/widgets/framework.dart:5203:6) #2 State.setState (package:flutter/src/widgets/framework.dart:1224:15) #3 _BetterPlayerSubtitlesDrawerState._updateState (package:better_player_plus/src/subtitles/better_player_subtitles_drawer.dart:79:7) #4 ChangeNotifier.notifyListeners (package:flutter/src/foundation/change_notifier.dart:437:24) #5 ValueNotifier.value= (package:flutter/src/foundation/change_notifier.dart:559:5) #6 VideoPlayerController.pause (package:better_player_plus/src/video_player/video_player.dart:442:5) #7 BetterPlayerController.pause (package:better_player_plus/src/core/better_player_controller.dart:584:34) #8 BetterPlayerController.dispose (package:better_player_plus/src/core/better_player_controller.dart:1207:9) #9 _BetterPlayerState.dispose (package:better_player_plus/src/core/better_player.dart:115:23) #10 StatefulElement.unmount (package:flutter/src/widgets/framework.dart:5840:11) #11 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2078:13) #12 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #13 MultiChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:7012:16) #14 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #15 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #16 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #17 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #18 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #19 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #20 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #21 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #22 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #23 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #24 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #25 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #26 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #27 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #28 MultiChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:7012:16) #29 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #30 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #31 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #32 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #33 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #34 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #35 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #36 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #37 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #38 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #39 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #40 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #41 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #42 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #43 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #44 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #45 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #46 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6900:14) #47 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #48 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #49 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #50 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #51 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #52 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6900:14) #53 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #54 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #55 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #56 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #57 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #58 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #59 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #60 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #61 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #62 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #63 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #64 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #65 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #66 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #67 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #68 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #69 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #70 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #71 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #72 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #73 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #74 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #75 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #76 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #77 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #78 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #79 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #80 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #81 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #82 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #83 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #84 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #85 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #86 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #87 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #88 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6900:14) #89 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #90 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #91 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6900:14) #92 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #93 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #94 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #95 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #96 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #97 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #98 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #99 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #100 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6900:14) #101 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #102 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #103 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #104 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #105 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #106 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6900:14) #107 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #108 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #109 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #110 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #111 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #112 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #113 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #114 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #115 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #116 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #117 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #118 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #119 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #120 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #121 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #122 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #123 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #124 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #125 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #126 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #127 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6900:14) #128 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #129 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #130 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #131 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #132 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #133 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #134 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #135 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #136 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #137 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #138 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #139 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #140 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #141 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #142 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #143 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #144 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #145 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:6900:14) #146 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #147 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #148 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #149 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #150 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #151 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #152 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #153 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #154 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #155 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #156 _InactiveElements._unmount.<anonymous closure> (package:flutter/src/widgets/framework.dart:2076:7) #157 ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:5683:14) #158 _InactiveElements._unmount (package:flutter/src/widgets/framework.dart:2074:13) #159 ListIterable.forEach (dart:_internal/iterable.dart:49:13) #160 _InactiveElements._unmountAll (package:flutter/src/widgets/framework.dart:2087:25) #161 BuildOwner.lockState (package:flutter/src/widgets/framework.dart:2954:15) #162 BuildOwner.finalizeTree (package:flutter/src/widgets/framework.dart:3264:7) #163 WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:1183:19) #164 RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:475:5) #165 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1397:15) #166 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1318:9) #167 SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:1176:5) #168 _invoke (dart:ui/hooks.dart:312:13) #169 PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:427:5) #170 _drawFrame (dart:ui/hooks.dart:283:31) The VideoPlayerController sending notification was: VideoPlayerController#77d27(VideoPlayerValue(duration: 0:51:26.720000, size: Size(1920.0, 960.0), position: 0:00:08.695000, absolutePosition: null, buffered: [DurationRange(start: 0:00:00.000000, end: 0:00:08.695000)], isPlaying: false, isLooping: false, isBuffering: false, volume: 1.0, errorDescription: null)) ==================================================================================================== E/flutter (17057): [ERROR:f. 问题还在
最新发布
07-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

talk_8

真诚赞赏,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值