不可变的StatefulWidget和Flutter中的State有什么用,但是只能使一个可变的StatefulWidget没有状态

时间:2018-10-27 06:22:33

标签: dart flutter

为什么颤动与两个独立的不可变 StatefulWidget可变 State相关?但是是否可以使一个 mutable StatefulWidget类并管理其中的状态?我认为实现这两个类以创建 StatefulWidget很烦人。

请向我解释这两个类的实际用法。

1 个答案:

答案 0 :(得分:1)

否,这是不可能的。 StatefulWidgets分为2类,因为其中一部分是完全不变的。 Widget子类不能存储任何可变字段。

我们不在React中,“组件”是可变的,并且实例在组件的整个生命周期中都保持不变。

在扑朔迷离中,小部件的寿命很短。每当我们想要修改某些内容时,我们都会创建一个新的小部件实例。


逆向State和StatefulWidget之间的生命周期很容易做到。并在抽象界面下隐藏“拆分为两个类”

class Foo extends SimpleStateWidget<int> {
  @override
  int initState(BuildContext context) {
    return 42;
  }

  @override
  Widget build(BuildContext context, int state, SetState<int> setState) {
    return RaisedButton(
      onPressed: () => setState(state + 1),
      child: Text(state.toString()),
    );
  }
}

如果这是您的事,则界面如下:

typedef SetState<T> = void Function(T state);

abstract class SimpleStateWidget<T> extends StatefulWidget {
  T initState(BuildContext context, T state) => state;

  T didChangeDependencies(BuildContext context, T state) => state;

  void dispose(BuildContext context, T state) => state;

  T didUpdateWidget(BuildContext context, T state) => state;

  T deactivate(BuildContext context, T state) => state;

  T reassemble(BuildContext context, T state) => state;

  Widget build(BuildContext context, T state, SetState<T> setState);

  @override
  _SimpleStateWidgetState<T> createState() => _SimpleStateWidgetState<T>();
}

class _SimpleStateWidgetState<T> extends State<SimpleStateWidget<T>> {
  T state;

  @override
  void initState() {
    super.initState();
    state = widget.initState(context);
  }

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    state = widget.didChangeDependencies(context, state);
  }

  @override
  void dispose() {
    widget.dispose(context, state);
    super.dispose();
  }

  @override
  void deactivate() {
    state = widget.deactivate(context, state);
    super.deactivate();
  }

  @override
  void reassemble() {
    super.reassemble();
    state = widget.reassemble(context, state);
  }

  @override
  Widget build(BuildContext context) {
    return widget.build(context, state, _setState);
  }

  _setState(T value) {
    setState(() {
      state = value;
    });
  }
}