flutter自定义控件 - StatefulWidget获取当前State

问题描述

StatefulWidget作为一种状态可变的控件,其状态的改变通常是由State.setState进行的,但当我们需要在StatefulWidget之外改变它的状态时,因Widget的重新构造并不一定使得State重新构造,所以我们难以直接获取当前Widget所绑定的State,从而改变StatefulWidget的状态。

解决方案

常规方案

我们可以为StatefulWidget设置一个GlobalKey(),通过GlobalKey.currentState来获取当前绑定的State实例。示例如下:

class _Widget extends StatefulWidget {
  final GlobalKey _key;
  final double width;
  final double height;

  const _Widget(this.width, this.height, this._key) : super(key: _key);

  @override
  State<StatefulWidget> createState() => _State();

  void setSize(double width, double height) {
    var state = _key.currentState;
    if (state is _State) {
      state.setSize(width, height);
    }
  }
}

class _State extends State<_Widget> {
  ...
  void setSize(double width, double height) {
    setState(() {
      _width = width;
      _height = height;
    });
  }
  ...
}

此时就可以通过_Widget.setSize来改变该StatefulWidget的状态。

另辟蹊径

只适用于只使用StatefulWidget的一个实例。
对于一个StatefulWidget,其Widget实例可以有多个,但其State实例只有一个。因此当只使用该StatefulWidget的一个实例时(即页面上只有一个该自定义的StatefulWidget控件),可以通过静态字段来引用State实例。示例如下:

class _Widget extends StatefulWidget {
  final double width;
  final double height;

  const _Widget(this.width, this.height, {Key? key}) : super(key: key);

  @override
  State<StatefulWidget> createState() {
    return _State();
  }

  void setSize(double width, double height) {
    _State.state?.setSize(width, height);
  }
}

class _State extends State<_Widget> {
  static _State? state;

  _State() {
    state = this;
  }

  void setSize(double width, double height) {
    setState(() {
      _width = width;
      _height = height;
    });
  }

  @override
  void dispose() {
    super.dispose();
    state = null;
  }

  ...
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值