FlutterFlutter_appselector

Flutter state生命周期方法之didChangeDep

2020-04-09  本文已影响0人  mtko

1. didChangeDependencies

这个生命周期方法很多文章没讲明白,大都一语带过

依赖变化具体是指什么发生了变化?是widget的类型?布局?某些属性值?

先抛结论:widget树中,若节点的父级结构中的层级父级结构中的任一节点的widget类型有变化,节点调用didChangeDependencies;若仅仅是父级结构某一节点的widget的某些属性值变化,节点不会调用didChangeDependencies

看个例子

import 'package:flutter/material.dart';

class A extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => AState();
}

class AState extends State<A> {
  bool bDependenciesShouldChange = false;

  @override
  void initState() {
    super.initState();
    Future.delayed(Duration(seconds: 15), () {
      bDependenciesShouldChange = true;
      setState(() {});
    });
  }

  @override
  Widget build(BuildContext context) {
    /// B`父级结构中的层级`发生变化时(`Scaffold`、`Container`、`C`、`B` => `Scaffold`、`Container`、`C`、`SizedBox`、`B`), B会执行didChangeDependencies
    return bDependenciesShouldChange
        ? Scaffold(
            body: Container(
            height: 500,
            alignment: Alignment.centerLeft,
            child: C(child: B()),
          ))
        : Scaffold(
            body: Container(
            height: 500,
            alignment: Alignment.centerLeft,
            child: C(child: SizedBox(width: 20, height: 50, child: B())),
          ));

    // /// B`父级结构中的任一节点的widget类型`发生变化时(`Container` => `Center`), B会执行didChangeDependencies
    // return bDependenciesShouldChange
    //     ? Scaffold(body: Center(child: C(child: B())))
    //     : Scaffold(
    //         body: Container(
    //         height: 500,
    //         alignment: Alignment.centerLeft,
    //         child: C(child: B()),
    //       ));
  }

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    debugPrint("AdidChangeDependencies");
  }
}

class B extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => BState();
}

class BState extends State<B> {
  @override
  Widget build(BuildContext context) {
    return Center(child: Text("B"));
  }

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    debugPrint("BdidChangeDependencies");
  }
}

class C extends StatefulWidget {
  final Widget child;

  C({Key key, this.child}) : super(key: key);

  @override
  State<StatefulWidget> createState() => CState();
}

class CState extends State<C> {
  @override
  Widget build(BuildContext context) {
    return widget.child;
  }

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    debugPrint("CdidChangeDependencies");
  }
}

2. didUpdateWidget

先抛结论:widget树中,若节点调用setState方法,节点本身不会触发didUpdateWidget,此节点的子节点 调用didUpdateWidget

看个例子

A调用reload后,A不会调用didUpdateWidget,A的子节点B调用didUpdateWidget

class A extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => AState();
}

class AState extends State {
  @override
  Widget build(BuildContext context) {
    return B();
  }

  /// AState调用此方法后,[AState.didUpdateWidget]不会调用, [BState.didUpdateWidget]会调用
  void reload() {
    setState(() {});
  }

  @override
  void didUpdateWidget(StatefulWidget oldWidget) {
    super.didUpdateWidget(oldWidget);
  }
}

class B extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => AState();
}

class BState extends State {
  @override
  Widget build(BuildContext context) {
    return null;
  }

  /// AState调用[AState.reload]后,[AState.didUpdateWidget]不会调用, [BState.didUpdateWidget]会调用
  @override
  void didUpdateWidget(StatefulWidget oldWidget) {
    super.didUpdateWidget(oldWidget);
  }
}

附Demo

上一篇 下一篇

猜你喜欢

热点阅读