Каков контекст / область применения вычислительной функции Flutter? - PullRequest
0 голосов
/ 30 августа 2018

Я узнаю о функции вычисления Флаттера . Насколько я понимаю, это для того, чтобы перенести тяжелую вычислительную работу в другой поток, чтобы не блокировать поток пользовательского интерфейса. Я столкнулся с некоторым поведением, которое я не совсем понимаю. Рассмотрим приложение ниже.

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),
      ),
    );
  }
}

Вывод функции _testCompute:

values are: Foo undefined
values are: Foo undefined
values are: Foo Bar
values are: Foo undefined

Отлично компилируется. Я ожидаю, что result4 будет таким же, как result3. Кто-нибудь может объяснить, почему это не так? Я также попробовал другой подход, используя «глобалы», как описано здесь , но результат был таким же.

1 Ответ

0 голосов
/ 30 августа 2018

compute() создает новый изолят. Изоляты, созданные таким образом, не делят ничего, кроме кода Это похоже на то, как если бы вы начинали новый процесс с того же проекта, используя _calculate в качестве точки входа вместо main.

compute передает 'values are:' в isolate с использованием комбинации SendPort / ReceivePort, а затем значение передается в _calculate в качестве параметра, когда изолят начинает работать.

Значения передаются по значению, поэтому передача ссылки на объект и изменение ее на другой стороне не окажет никакого влияния на сторону отправителя.

Опять же, изоляты не имеют общего состояния, только код, и они общаются, используя SendPort / ReceivePort для передачи значений между основным изолятором и изолятором "compute".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...