Flutter信号管理插件onix_flutter_signals的使用

Flutter信号管理插件onix_flutter_signals的使用

特性

本包包含一些基础类,旨在改进使用Signals状态管理的体验。

  • PassiveSignalState - 一个状态类,不会在模型变化时自动重建小部件。你需要使用WatchWatch.builder来包裹需要重建的小部件。还可以使用.watch(context)扩展方法在信号变化时重建小部件。

  • ReactiveSignalState - 一个状态类,会在模型变化时自动重建小部件。它在内部使用了Watch小部件。

使用

要使用此包,需要在pubspec.yaml文件中添加Signals作为依赖项:

dependencies:
  signals: ^x.x.x

接下来,扩展你的ScreenModel类为SignalModel

class MainScreenModel extends SignalModel {

向模型中添加信号:

final Signal<int> counter = signal(0);

在构造函数中初始化computedModel以在信号变化时改变模型的状态。如果使用多个信号,不要忘记添加它们。computedModel是一个信号,当它所依赖的任何信号发生变化时,它的值也会改变。对于非整数类型,需要计算其哈希值:

final Signal<int> counter = signal(0);
final Signal<String> text = signal('');

MainScreenModel() {
  computedModel = computed(
    () => counter.value.hashCode ^ text.value.hashCode,
  );
}

扩展你的状态fulWidget状态为PassiveSignalState以手动控制小部件的重建:

class _MainScreenState extends PassiveSignalState<MainScreenModel, MainScreen>

或者扩展为ReactiveSignalState以在模型变化时自动重建小部件:

class _MainScreenState extends ReactiveSignalState<MainScreenModel, MainScreen>

createModel函数中创建模型实例:

MainScreenModel createModel() => MainScreenModel();

buildWidget方法中编写小部件主体,而不是build方法:

[@override](/user/override)
Widget buildWidget(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: Text('主屏幕'),
    ),
    body: Center(
      child: Watch(
        (context) => Text(
          '${stateSignals.counter}',
          style: Theme.of(context).textTheme.headlineMedium,
        ),
      ),
    ),
    floatingActionButton: FloatingActionButton(
      onPressed: () {
        setState(() {
          stateSignals.counter.value++;
        });
      },
      child: Icon(Icons.add),
    ),
  );
}

如果你使用的是PassiveSignalState,你必须手动重建小部件,可以使用以下方式:

使用Watch小部件:

Watch(
  (context) => Text(
    '${stateSignals.counter}',
    style: Theme.of(context).textTheme.headlineMedium,
  ),
),

使用Watch.builder小部件:

Watch.builder(
  builder: (context) => Text(
    '${stateSignals.counter}',
    style: Theme.of(context).textTheme.headlineMedium,
  ),
),

或者使用.watch(context)扩展方法:

Text(
  '${stateSignals.counter}',
  style: Theme.of(context).textTheme.headlineMedium,
).watch(context),

示例代码

以下是完整的示例代码,展示了如何使用onix_flutter_signals插件。

import 'package:example/signals_examples/passive/passive_state_example.dart';
import 'package:flutter/material.dart';

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

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

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

更多关于Flutter信号管理插件onix_flutter_signals的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter信号管理插件onix_flutter_signals的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


onix_flutter_signals 是一个用于 Flutter 应用的信号管理插件,它提供了一种简洁的方式来管理和传递信号(signals),类似于事件或通知。这个插件可以帮助开发者在应用中实现组件之间的通信,尤其是在需要跨组件或跨层级传递数据时。

安装

首先,你需要在 pubspec.yaml 文件中添加 onix_flutter_signals 依赖:

dependencies:
  onix_flutter_signals: ^1.0.0

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

基本用法

onix_flutter_signals 提供了 Signal 类来创建和管理信号。你可以通过 Signal 来发送和监听信号。

创建信号

import 'package:onix_flutter_signals/onix_flutter_signals.dart';

final signal = Signal<int>();

这里我们创建了一个 Signal,它可以传递 int 类型的值。

发送信号

你可以使用 emit 方法来发送信号:

signal.emit(42);

监听信号

你可以使用 listen 方法来监听信号:

signal.listen((value) {
  print('Received signal with value: $value');
});

示例

以下是一个简单的示例,展示了如何在 Flutter 应用中使用 onix_flutter_signals 进行组件间的通信。

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

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

class MyApp extends StatelessWidget {
  final signal = Signal<String>();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Signal Example')),
        body: Column(
          children: [
            SignalSender(signal: signal),
            SignalReceiver(signal: signal),
          ],
        ),
      ),
    );
  }
}

class SignalSender extends StatelessWidget {
  final Signal<String> signal;

  SignalSender({required this.signal});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: () {
        signal.emit('Hello from SignalSender!');
      },
      child: Text('Send Signal'),
    );
  }
}

class SignalReceiver extends StatefulWidget {
  final Signal<String> signal;

  SignalReceiver({required this.signal});

  [@override](/user/override)
  _SignalReceiverState createState() => _SignalReceiverState();
}

class _SignalReceiverState extends State<SignalReceiver> {
  String? receivedValue;

  [@override](/user/override)
  void initState() {
    super.initState();
    widget.signal.listen((value) {
      setState(() {
        receivedValue = value;
      });
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Text('Received: $receivedValue');
  }
}
回到顶部