Flutter/Dart:如何执行同步

jit*_*555 3 dart flutter

问题本身就说明了这一点,这里我有一个列表,它write多次调用方法,但它没有按顺序提供输出。

void main() {
   List<int> list = [1, 2, 3, 4];
   write(list);
   write(list);
}
Run Code Online (Sandbox Code Playgroud)

write函数获取列表并延迟 1 毫秒打印值

write(List<int> values) async {
  for (int value in values) {
    await Future.delayed(new Duration(microseconds: 1));
    print(value);
  }
}
Run Code Online (Sandbox Code Playgroud)

输出:

I/flutter (21092): 1
I/flutter (21092): 1
I/flutter (21092): 2
I/flutter (21092): 2
I/flutter (21092): 3
I/flutter (21092): 3
I/flutter (21092): 4
I/flutter (21092): 4
Run Code Online (Sandbox Code Playgroud)

预期输出:

I/flutter (21092): 1
I/flutter (21092): 2
I/flutter (21092): 3
I/flutter (21092): 4
I/flutter (21092): 1
I/flutter (21092): 2
I/flutter (21092): 3
I/flutter (21092): 4
Run Code Online (Sandbox Code Playgroud)

jit*_*555 7

为了实现这个使用synchronizedlib

将其添加到包的 pubspec.yaml 文件中:

dependencies:
  synchronized: ^2.2.0+2
Run Code Online (Sandbox Code Playgroud)

代码片段:

write(List<int> values) async {
  var lock = Lock();
  for (int value in values) {
    lock.synchronized(() {
      Future.delayed(new Duration(seconds: 2));
    });
    print(value);
  }
}
Run Code Online (Sandbox Code Playgroud)

输出:

I/flutter (21092): 1
I/flutter (21092): 2
I/flutter (21092): 3
I/flutter (21092): 4
I/flutter (21092): 1
I/flutter (21092): 2
I/flutter (21092): 3
I/flutter (21092): 4
Run Code Online (Sandbox Code Playgroud)

注意: synchronized block将首先运行所有列表,然后只允许进入第二个。