Flutter响应式计算插件computed_flutter的使用

Flutter响应式计算插件computed_flutter的使用

简介

computed_flutter 是一个用于在 Flutter 中实现响应式计算的插件。它允许你将 Computed 与 Flutter 特定的功能(如 WidgetListenable)结合起来。

目录

如何使用

假设你有一个数据源,例如一个表示外部状态的 ValueListenable<int>

ValueListenable<int> v;

你希望你的用户界面能够与这个外部状态保持同步。假设你简单地想显示外部状态的值,你可以使用 Computed 实现这一点,而无需编写多余的代码:

Text('${v.use}')

请注意,这不使用代码生成,也不限制你的代码库中每个对象类型最多只有一个数据源。

使用Computed与小部件

使用 Computed 提供的功能(如 .use.react)在小部件的 build 方法中需要 Computed 意识这些方法的存在。你可以通过以下几种方式实现这一点:

使用 Computed[Stateful]Widget

如果你有一个自定义的小部件,继承自 StatelessWidgetStatefulWidget,可以修改它们以继承自 ComputedWidgetComputedStatefulWidget

class MyWidget extends ComputedWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    // 这实际上是在运行一个计算
    return Text('${v.use}'); // 当 [v] 发生变化时自动重新运行
  }
}

使用 ComputedFlutter[Stateful]Mixin

如果你不想让你的小部件继承自 Computed[Stateful]Widget,可能是因为它们已经继承了其他类,你可以使用混入:

class MyWidget extends MyOtherWidget with ComputedFlutterMixin {
  ...
}

class MyStatefulWidget extends MyOtherStatefulWidget with ComputedFlutterStatefulMixin {
  ...
}

使用 ComputedBuilder

如果你正在使用一个无法修改定义的小部件,或者希望限制反应性小部件重建的范围,可以使用 ComputedBuilder

ComputedBuilder(builder: (BuildContext context) => 
  ExternalWidget(v.use)
)

摄入数据源

Computed Flutter 支持通过 .use 反应性地依赖于 ValueListenable,就像 Computed 一样:

ValueListenable<int> v;

final c = $((){
    v.use; // 反应性地依赖于 [v]
});

要依赖于 Listenable 的更改,你可以使用 .watch

class MyListenable implements Listenable {
  int get value => ...;
  ...
}

MyListenable l;

final c = $((){
    l.watch.value; // 反应性地依赖于 [l]
});

使用计算结果

Computed Flutter 允许你将计算结果转换为 ListenableValueListenable

final c = $(() => ...); // 一个计算

c.asListenable; // 返回一个 [ComputedListenable]
c.asValueListenable; // 返回一个 [ValueListenable]

当然,还可以使用其他基于基础 Computed 包定义的方法。为了方便引用,这包括 .use, .listen.asStream


完整示例

以下是一个完整的示例,展示了如何使用 computed_flutter 插件来创建一个简单的计数器应用:

import 'package:computed_flutter/computed_flutter.dart';
import 'package:flutter/material.dart';

final count = ValueNotifier(0);

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Computed Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(),
    );
  }
}

// 注意,与普通的计数器应用不同,这个小部件是无状态的
class MyHomePage extends ComputedWidget {
  const MyHomePage({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: const Text('Computed Flutter Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            const Text(
              'You have pushed the button this many times:',
            ),
            Text('${count.use}', style: Theme.of(context).textTheme.headlineMedium),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => count.value++,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

更多关于Flutter响应式计算插件computed_flutter的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter响应式计算插件computed_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter中使用computed_flutter插件进行响应式计算的代码示例。computed_flutter插件允许你创建可缓存和可监听的计算值,这对于提高应用的性能和响应性非常有帮助。

首先,确保你已经在pubspec.yaml文件中添加了computed_flutter依赖:

dependencies:
  flutter:
    sdk: flutter
  computed_flutter: ^x.y.z  # 替换为最新版本号

然后,运行flutter pub get来安装依赖。

以下是一个完整的示例,展示了如何使用computed_flutter进行响应式计算:

import 'package:flutter/material.dart';
import 'package:computed_flutter/computed_flutter.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: ComputedExample(),
    );
  }
}

class ComputedExample extends StatefulWidget {
  @override
  _ComputedExampleState createState() => _ComputedExampleState();
}

class _ComputedExampleState extends State<ComputedExample> with ComputedWidgetMixin {
  final _number1 = Computed<int>(0);
  final _number2 = Computed<int>(0);
  final _sum = Computed<int>(
    initialValue: 0,
    compute: () => _number1.value + _number2.value,
    dependsOn: [_number1, _number2],
  );

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Computed Flutter Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            TextField(
              decoration: InputDecoration(labelText: 'Number 1'),
              keyboardType: TextInputType.number,
              onChanged: (value) {
                int? num = int.tryParse(value);
                if (num != null) {
                  _number1.update(num);
                }
              },
            ),
            TextField(
              decoration: InputDecoration(labelText: 'Number 2'),
              keyboardType: TextInputType.number,
              onChanged: (value) {
                int? num = int.tryParse(value);
                if (num != null) {
                  _number2.update(num);
                }
              },
            ),
            SizedBox(height: 20),
            Text(
              'Sum: $_sum.value',
              style: TextStyle(fontSize: 24),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中有两个输入框用于输入数字,以及一个文本显示它们的和。

  1. 创建Computed变量

    • _number1_number2 是两个整数类型的Computed变量,初始值设为0。
    • _sum 是一个计算得到的整数Computed变量,它依赖于_number1_number2。当这两个变量之一的值发生变化时,_sum会自动重新计算。
  2. 更新Computed变量的值

    • TextFieldonChanged回调中,我们尝试解析输入值为整数,并更新相应的Computed变量。
  3. 显示计算结果

    • 使用Text组件显示_sum的值。

通过这种方式,你可以使用computed_flutter插件在Flutter应用中实现高效的响应式计算。

回到顶部