Return Dart 级联的值

Return value for Dart cascade

我正在尝试使用 Dart 级联运算符来实现构建器模式。

我有这个(破解)class:

import 'package:test/test.dart';
class Scope
{
   
   void value<T>(ScopeKey<T> key, T value) {}
   R run<R>(R Function() callback) => callback();
}

int use(String key) => 18;

我想使用级联来调用 'run' 方法,该方法应该 return 一个值。

我想做的是:

      final ageKey = ScopeKey<int>();
      final age = Scope()
       ..value<int>(ageKey, 18);
       .run<int>(() => use(ageKey));

      expect(age, equals(18));

注意单个“.”在 'run'.

之前

我要做的是:

   final ageKey = ScopeKey<int>();
      final scope = Scope()..value<int>(ageKey, 18);

      final age = scope.run<int>(() => use(ageKey));

      expect(age, equals(18));

我的理解是 .. 丢弃 value 调用的结果,取而代之的是 returns Scope 对象。

所以Scope()..value()应该return一个作用域。

因此我在等电话

Scope()..value().run() => 1

到return 1作为运行的左手操作数应该是Scope对象。

相反,它会生成一个编译错误:

This expression has a type of 'void' so its value can't be used. Try checking to see if you're using the correct API; there might be a function or call that returns void you didn't expect. Also check type parameters and variables which might also be

这意味着 .运行 正在使用 value 的 return 值。

我误解了什么?

您可以添加括号,以便在您的 Scope 上调用 .run

final age = (Scope()..value<int>(ageKey, 18)).run<int>(() => use(ageKey));

使用级联,您目前可以执行如下操作:

class Collection<T> {
  List<T> items = [];
  @override
  String toString() => 'Items($items)';
}

void main() {
  final items = Collection<int>()
    ..items.add(1);
  print(items);
}

这只有效,因为 .add 是在 items 而不是 Collection 上调用的。缺点是如果你想在级联调用之后调用 Collection 上的方法,你必须将表达式括在括号中。