dart - 不可变的StatefulWidget和Flutter中的State有什么用,但是只能做一个可变的StatefulWidget没有state

标签 dart flutter

为什么 flutter 是由两个独立的 immutable StatefulWidgetmutable State 关联的?但是是否可以制作一个可变 StatefulWidget 类并管理其中的状态?我认为实现这两个类以创建 StatefulWidget 非常烦人。

给我解释一下这两个类的实际用法。

最佳答案

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

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

在 Flutter 中,小部件的生命周期非常短。每次我们想要修改某些内容时,我们都会创建一个新的小部件实例。


然而,反转 State 和 StatefulWidget 之间的生命周期是很容易做到的。并将“拆分为两个类”隐藏在抽象接口(interface)下

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

  @override
  Widget build(BuildContext context, SetState<int> setState, int state) {
    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, SetState<T> setState);

  void didChangeDependencies(
          BuildContext context, SetState<T> setState, T state) {}

  void dispose(BuildContext context, T state) {}

  void didUpdateWidget(BuildContext context, SetState<T> setState, T state) {}

  void deactivate(BuildContext context, SetState<T> setState, T state) {}

  void reassemble(BuildContext context, SetState<T> setState, T state) {}

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

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

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

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

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

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

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

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

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

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

关于dart - 不可变的StatefulWidget和Flutter中的State有什么用,但是只能做一个可变的StatefulWidget没有state,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53019294/

相关文章:

flutter - 从子子部件通知父部件

Flutter:如何检查 Widget 是否是一个滚动的 widget

flutter - 某些字符未正确加载

dart - 如何在Listview.Builder中添加一些底部值?

android - 如何通过创建一个由3个容器(左,中,右部分)组成的单独的ListView来避免无限的高度声明

dart - 没有 AppBar 的 Flutter 应用设计

flutter - Flutter 中的标准底板

flutter - FLUTTER JUST_AUDIO Navigator.Push在完成播放后不起作用

xcode - Flutter 发布版本立即崩溃,没有记录任何错误(iOS)

任务应用程序 :mergeDebugNativeLibs and app:mergeDebugJavaResource 的 Flutter 失败