Flutter属性监听插件simple_property_observer的使用

Flutter属性监听插件simple_property_observer的使用

simple_property_observer 是一个用于观察属性变化的简单Dart包。它也被称为属性更改通知器。

如何使用

本仓库包含两个包:simple_property_observersimple_property_observer_builder。这些包可以在纯Dart项目和Flutter项目中使用。example 是一个简单的使用这些包的例子。

依赖设置

在你的 pubspec.yaml 文件中,添加以下依赖项:

dependencies:
  simple_property_observer: any

dev_dependencies:
  build_runner: any
  simple_property_observer_builder: any
  • simple_property_observer 包含了属性可观察模式的定义和自动生成的注解。
  • simple_property_observer_builder 包含了命令行工具用于自动生成文件。

定义你的类

例如,编写以下带有注解的类:

import 'package:simple_property_observer/simple_property_observer.dart';

part 'example.g.dart';

[@propertyObservable](/user/propertyObservable)
class Example {
  [@observable](/user/observable)
  String? get observableProperty => null;
}

Dart分析器会指出错误,但忽略它并继续到下一步。

要点:

  • 使用 [@propertyObservable](/user/propertyObservable) 注解你的类以自动生成属性可观察模式。
  • 创建一个 GETTER 并用 [@observable](/user/observable) 注解它。
  • 添加 part 句子用于自动生成文件。

然后,在终端运行构建命令:

$ flutter packages pub run build_runner build

如果你创建的是一个纯Dart项目,则运行以下命令:

$ dart run build_runner build

完成命令后,你会看到 example.g.dart 文件:

// GENERATED CODE - DO NOT MODIFY BY HAND

part of 'example.dart';

// **************************************************************************
// PropertyObservableGenerator
// **************************************************************************

mixin _ObservableMembers on PropertyObservable {
  String? __observableProperty;
  set observableProperty(String? value) {
    if (__observableProperty == value) {
      return;
    }
    final oldValue = __observableProperty;
    __observableProperty = value;
    notifyPropertyChanged(PropertyChangedInfo(
        'observableProperty', oldValue, __observableProperty));
  }
}

要点:

然后,你必须修改 example.dart 文件如下:

import 'package:simple_property_observer/simple_property_observer.dart';

part 'example.g.dart';

[@propertyObservable](/user/propertyObservable)
class Example with PropertyObservable, _ObservableMembers {
  [@observable](/user/observable)
  String? get observableProperty => __observableProperty;
}

添加 with PropertyObservable, _ObservableMembers 并将 GETTER 从 null 修改为 __observableProperty

观察实例

你可以使用 registerObserver 方法来观察属性的变化:

import 'example.dart';

void main() {
  final example = Example();

  // 观察属性变化
  example.registerObserver((info) {
    print('${info.name} changed: from ${info.oldValue} to ${info.newValue}');
  });

  print('set Apple');
  example.observableProperty = 'Apple';

  print('set Banana');
  example.observableProperty = 'Banana';

  // 显示以下输出:
  // set Apple
  // observableProperty changed: from null to Apple
  // set Banana
  // observableProperty changed: from Apple to Banana
}

你也可以使用 unregisterObserver 方法取消观察。

示例Demo

以下是完整的示例代码,演示如何使用 simple_property_observer 插件:

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

part 'example.g.dart';

[@propertyObservable](/user/propertyObservable)
class Example with PropertyObservable, _ObservableMembers {
  [@observable](/user/observable)
  String? get observableProperty => __observableProperty;

  void changeProperty(String newValue) {
    observableProperty = newValue;
  }
}

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text("Simple Property Observer Example")),
        body: Center(
          child: ExamplePropertyObserver(),
        ),
      ),
    );
  }
}

class ExamplePropertyObserver extends StatefulWidget {
  [@override](/user/override)
  _ExamplePropertyObserverState createState() => _ExamplePropertyObserverState();
}

class _ExamplePropertyObserverState extends State<ExamplePropertyObserver> {
  final Example _example = Example();

  [@override](/user/override)
  void initState() {
    super.initState();
    _example.registerObserver((info) {
      setState(() {});
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        ElevatedButton(
          onPressed: () {
            _example.changeProperty("Apple");
          },
          child: Text("Set Apple"),
        ),
        ElevatedButton(
          onPressed: () {
            _example.changeProperty("Banana");
          },
          child: Text("Set Banana"),
        ),
        Text(_example.observableProperty ?? "No Value"),
      ],
    );
  }
}

更多关于Flutter属性监听插件simple_property_observer的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter属性监听插件simple_property_observer的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


simple_property_observer 是一个用于 Flutter 的插件,它可以帮助你轻松地监听对象属性的变化。这个插件非常适合在需要观察某个对象的属性变化并做出相应反应的场景中使用。

安装

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

dependencies:
  flutter:
    sdk: flutter
  simple_property_observer: ^1.0.0  # 请使用最新版本

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

基本用法

simple_property_observer 的核心是 PropertyObserver 类,它允许你监听对象属性的变化。

1. 创建一个可观察的对象

首先,你需要创建一个包含你想要监听属性的类,并使用 [@observable](/user/observable) 注解标记这些属性。

import 'package:simple_property_observer/simple_property_observer.dart';

class User {
  [@observable](/user/observable)
  String name;

  [@observable](/user/observable)
  int age;

  User(this.name, this.age);
}

2. 创建 PropertyObserver 实例

接下来,你可以创建一个 PropertyObserver 实例来监听这个对象的属性变化。

void main() {
  final user = User('Alice', 25);
  final observer = PropertyObserver(user);

  observer.listenToProperty('name', (newValue, oldValue) {
    print('Name changed from $oldValue to $newValue');
  });

  observer.listenToProperty('age', (newValue, oldValue) {
    print('Age changed from $oldValue to $newValue');
  });

  // 改变属性值
  user.name = 'Bob';  // 输出: Name changed from Alice to Bob
  user.age = 30;      // 输出: Age changed from 25 to 30
}

3. 监听多个属性

你可以同时监听多个属性,并在它们发生变化时执行不同的回调。

observer.listenToProperties(['name', 'age'], (propertyName, newValue, oldValue) {
  print('$propertyName changed from $oldValue to $newValue');
});

4. 停止监听

如果你不再需要监听某个属性,可以调用 stopListeningToProperty 方法来停止监听。

observer.stopListeningToProperty('name');

或者,你可以调用 stopListeningToAllProperties 方法来停止监听所有属性。

observer.stopListeningToAllProperties();

高级用法

监听嵌套属性

simple_property_observer 还支持监听嵌套对象的属性。你可以使用点符号来指定嵌套属性的路径。

class Address {
  [@observable](/user/observable)
  String city;

  Address(this.city);
}

class User {
  [@observable](/user/observable)
  String name;

  [@observable](/user/observable)
  Address address;

  User(this.name, this.address);
}

void main() {
  final user = User('Alice', Address('New York'));
  final observer = PropertyObserver(user);

  observer.listenToProperty('address.city', (newValue, oldValue) {
    print('City changed from $oldValue to $newValue');
  });

  user.address.city = 'San Francisco';  // 输出: City changed from New York to San Francisco
}
回到顶部