我正在学习 Flutter 的计算功能。我的理解是,它是为了将计算量大的工作卸载到另一个线程,以免阻塞 UI 线程。我遇到了一些我不太理解的行为。考虑下面的应用程序。
import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
void main() => runApp(new MyApp());
class StringValues {
static String foo = 'Foo';
static String bar;
}
String _calculate(String value) {
return value + ' ' + (StringValues.foo ?? 'undefined') + ' ' + (StringValues.bar ?? 'undefined');
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Flutter Demo',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => new _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
void _testCompute() async {
String result1 = _calculate('values are:');
String result2 = await compute(_calculate, 'values are:');
StringValues.bar = 'Bar';
String result3 = _calculate('values are:');
String result4 = await compute(_calculate, 'values are:');
print(result1);
print(result2);
print(result3);
print(result4);
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text(widget.title),
),
floatingActionButton: new FloatingActionButton(
onPressed: _testCompute,
child: new Icon(Icons.print),
),
);
}
}
Run Code Online (Sandbox Code Playgroud)
_testCompute 函数的输出是:
values are: Foo undefined
values are: Foo undefined
values are: Foo Bar
values are: Foo undefined
Run Code Online (Sandbox Code Playgroud)
它编译得很好。我希望result4与 相同result3。谁能解释为什么不是?我还尝试了使用此处描述的“全局变量”的不同方法,但结果是相同的。
compute()创建一个新的隔离。以这种方式启动的隔离除了代码之外不共享任何内容。
这类似于您将使用同一项目启动一个新流程,只是使用_calculate作为入口点而不是main.
compute'values are:'使用isolateSendPort/ReceivePort 组合传递给,然后_calculate在隔离开始运行时将该值作为参数传递给。
这些值是按值传递的,因此传递对象引用并在另一端更改它不会对发送方产生任何影响。
同样,隔离区不共享状态,仅共享代码,并且它们使用SendPort/ReceivePort在主隔离区和“隔离区”之间来回传递值进行通信compute。
| 归档时间: |
|
| 查看次数: |
1235 次 |
| 最近记录: |