Flutter属性监听与构建插件simple_property_observer_builder的使用

Flutter属性监听与构建插件simple_property_observer_builder的使用

Dart包用于自动生成一个属性可观察类。 此包仅适用于开发环境。 请参阅simple_property_observer包。

如何使用

此存储库包含两个包,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
class Example {
  @observable
  String? get observableProperty => null;
}

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

注意点
  • 使用@propertyObservable注解您的类以自动生成属性可观察模式。
  • 创建一个GETTER并用@observable注解。
  • 添加part语句以生成自动文件。

然后,在终端中运行生成命令:

$ flutter packages pub run build_runner build

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

$ dart run build_runner build

完成命令后,您可以看到example.g.dart文件:

// 自动生成的代码 - 不要手动修改

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
class Example with PropertyObservable, _ObservableMembers {
  @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('设置为 Apple');
  example.observableProperty = 'Apple';

  print('设置为 Banana');
  example.observableProperty = 'Banana';

  // 显示输出如下:
  // 设置为 Apple
  // observableProperty changed: from null to Apple
  // 设置为 Banana
  // observableProperty changed: from Apple to Banana
}

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

1 回复

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


在Flutter中,属性监听是一个常见的需求,尤其是当你需要在某个属性发生变化时执行一些操作时。Flutter提供了一个内置的ValueNotifierValueListenableBuilder来实现属性的监听和响应。然而,有时候你可能需要一个更简单、更灵活的方式来监听属性的变化。这时候,simple_property_observer_builder插件可以派上用场。

simple_property_observer_builder 插件简介

simple_property_observer_builder 是一个轻量级的Flutter插件,它允许你轻松地监听对象属性的变化,并在属性变化时自动重建UI。这个插件使用起来非常简单,适合那些不需要复杂状态管理的场景。

安装

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

dependencies:
  flutter:
    sdk: flutter
  simple_property_observer_builder: ^1.0.0  # 请检查最新版本

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

使用示例

假设你有一个 User 类,并且你想在 Username 属性发生变化时自动更新UI。

1. 创建一个可观察的类

首先,你需要让你的类继承自 Observable,并且使用 @observable 注解来标记你想要监听的属性。

import 'package:simple_property_observer_builder/simple_property_observer_builder.dart';

class User extends Observable {
  @observable
  String name;

  User(this.name);
}

2. 使用 PropertyObserverBuilder 监听属性

接下来,你可以使用 PropertyObserverBuilder 来监听 User 对象的 name 属性,并在属性变化时自动更新UI。

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

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  User user = User('John Doe');

  void changeName() {
    setState(() {
      user.name = 'Jane Doe';
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        PropertyObserverBuilder(
          observable: user,
          property: 'name',
          builder: (context, value) {
            return Text(
              'Name: ${user.name}',
              style: TextStyle(fontSize: 24),
            );
          },
        ),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: changeName,
          child: Text('Change Name'),
        ),
      ],
    );
  }
}
回到顶部