dart 在Flutter中何时使用Valuechanged< >与Valuesetter< >

sr4lhrrt  于 2023-10-13  发布在  Flutter
关注(0)|答案(1)|浏览(192)

我一直在关注他们网站上的一些初学者flutter教程,并在做this教程的基本交互性,特别是父部件用于管理子部件状态的部分。有一个ParentWidget_ParentWidgetState类,其代码如下:

class ParentWidget extends StatefulWidget {
   @override
   _ParentWidgetState createState() => _ParentWidgetState();
}

class _ParentWidgetState extends State<ParentWidget> {
  bool _active = false;

  void _handleTapboxChanged(bool newValue) {
    setState(() {
       _active = newValue;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      child: TapboxB(
        active: _active,
        onChanged: _handleTapboxChanged,
      ),
    );
  }
}

TapboxBParentWidget的子类,其代码如下:

class TapboxB extends StatelessWidget {
  TapboxB({this.active: false, @required this.onChanged});

  final bool active;
  final ValueChanged<bool> onChanged;

  void _handleTap() {
    onChanged(!active);
  }

  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: _handleTap,
      child: Container(
        child: Column(
          //aligns column in the centre vertically
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(
              //sets text depending on _active boolean
              active ? 'Active' : 'Inactive',
              style: TextStyle(fontSize: 20.0, color: Colors.white),
            ),
            Text(
              'Tapbox B',
              style: TextStyle(fontSize: 14.0, color: Colors.white),
            ),
          ],
        ),
        width: 100.0,
        height: 100.0,
        decoration: BoxDecoration(
          //sets colour depending on _active boolean
          color: active ? Colors.lightGreen[700] : Colors.grey[600],
        ),
      ),
    );
  }
}

当单击小部件时,将调用_handleTap方法,该方法将调用onChanged回调,该回调将切换active变量。在onChanged的定义中,类型是ValueChanged<bool>,它被记录为“用于报告底层值已更改的回调的签名”。如果我将其更改为ValueSetter<bool>,应用程序的工作方式完全相同,似乎没有任何变化。那么我的问题是,这两者之间有什么区别呢?在这个特定的场景中,有更好的吗?

uqzxnwby

uqzxnwby1#

我使用 flutter ValueChanged ValueSetter 搜索文档,找到了this
void ValueSetter (T Value)
报告已设置值的回调的签名。
这是与ValueChanged相同的签名,但在调用回调时使用,即使底层值没有更改。例如,服务扩展使用此回调,因为无论给定值是否为新值,只要使用值调用扩展,服务扩展就会调用回调。
typedef ValueSetter<T> = void Function(T value);
因此,它们只是同一个底层类型的typedef,但其中一个具有不同的语义含义,可能被用作自文档化代码,尽管底层签名相同。
如果您不需要ValueSetter的后一种含义,那么就使用ValueChanged,正如API所说。

相关问题