公告

👇欢迎大家关注公众号&私信交流👇

Skip to content

Flutter 生命周期管理详解

Widget 生命周期

StatelessWidget 生命周期

dart
class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 构建 Widget
    return Container();
  }
}

StatelessWidget 的生命周期非常简单:

  1. 构造函数
  2. build 方法

StatefulWidget 生命周期

dart
class MyStatefulWidget extends StatefulWidget {
  @override
  _MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}

class _MyStatefulWidgetState extends State<MyStatefulWidget> {
  @override
  void initState() {
    super.initState();
    // 初始化状态
  }

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    // 依赖变化时调用
  }

  @override
  void didUpdateWidget(MyStatefulWidget oldWidget) {
    super.didUpdateWidget(oldWidget);
    // Widget 配置更新时调用
  }

  @override
  void setState(VoidCallback fn) {
    // 状态更新
    super.setState(fn);
  }

  @override
  void deactivate() {
    super.deactivate();
    // Widget 被移除时调用
  }

  @override
  void dispose() {
    super.dispose();
    // 释放资源
  }

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

StatefulWidget 的完整生命周期:

  1. createState
  2. initState
  3. didChangeDependencies
  4. build
  5. didUpdateWidget
  6. setState
  7. deactivate
  8. dispose

App 生命周期

dart
class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    switch (state) {
      case AppLifecycleState.resumed:
        // 应用程序可见且可响应用户操作
        break;
      case AppLifecycleState.inactive:
        // 应用程序处于非活动状态
        break;
      case AppLifecycleState.paused:
        // 应用程序完全不可见
        break;
      case AppLifecycleState.detached:
        // 应用程序仍在运行,但已分离
        break;
    }
  }

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

路由生命周期

dart
class MyRoute extends MaterialPageRoute {
  MyRoute({required WidgetBuilder builder}) : super(builder: builder);

  @override
  bool didPush() {
    // 路由被推入
    return super.didPush();
  }

  @override
  bool didPop(dynamic result) {
    // 路由被弹出
    return super.didPop(result);
  }

  @override
  void didReplace(Route? oldRoute) {
    // 路由被替换
    super.didReplace(oldRoute);
  }

  @override
  void didComplete(dynamic result) {
    // 路由完成
    super.didComplete(result);
  }
}

生命周期最佳实践

资源管理

dart
class ResourceWidget extends StatefulWidget {
  @override
  _ResourceWidgetState createState() => _ResourceWidgetState();
}

class _ResourceWidgetState extends State<ResourceWidget> {
  StreamSubscription? _subscription;

  @override
  void initState() {
    super.initState();
    _subscription = Stream.periodic(Duration(seconds: 1))
        .listen((data) => print('数据更新'));
  }

  @override
  void dispose() {
    _subscription?.cancel();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

性能优化

dart
class OptimizedWidget extends StatefulWidget {
  @override
  _OptimizedWidgetState createState() => _OptimizedWidgetState();
}

class _OptimizedWidgetState extends State<OptimizedWidget> {
  @override
  void didUpdateWidget(OptimizedWidget oldWidget) {
    super.didUpdateWidget(oldWidget);
    // 仅在必要时更新
    if (oldWidget.someProperty != widget.someProperty) {
      // 执行更新操作
    }
  }

  @override
  bool shouldRebuild(OptimizedWidget oldWidget) {
    // 控制是否需要重建
    return oldWidget.someProperty != widget.someProperty;
  }

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

常见问题和解决方案

内存泄漏防范

  1. 及时取消订阅和监听
  2. 正确释放控制器资源
  3. 避免在 dispose 后调用 setState

生命周期钩子使用建议

  1. initState:初始化数据和订阅
  2. dispose:清理资源和取消订阅
  3. didChangeDependencies:处理依赖变化
  4. didUpdateWidget:响应配置更新

最佳实践

  1. 合理使用 StatelessWidget 和 StatefulWidget
  2. 正确管理资源的生命周期
  3. 注意性能优化和内存管理
  4. 遵循 Flutter 的设计模式和最佳实践

总结

Flutter 的生命周期管理是应用开发中的核心概念,正确理解和使用这些生命周期可以帮助我们开发出更加稳定、高效的应用。通过合理管理 Widget、应用和路由的生命周期,我们可以更好地控制应用的行为和资源使用。