Flutter仓库通知插件repo_notifier的使用

发布于 1周前 作者 eggper 来自 Flutter

Flutter仓库通知插件repo_notifier的使用

Beta Release Notice

此包目前处于测试阶段,需要Dart SDK版本3.6.0-334.4.beta或更高。请确保您的项目满足这些要求后再使用该包。

特性

  • 内置状态管理以支持仓库操作
  • 类型安全的状态处理与模式匹配
  • 自动状态更新和UI重建
  • 支持带加载状态的CRUD操作
  • 与Flutter小部件轻松集成
  • 支持乐观更新及前一状态处理
  • 带有堆栈跟踪支持的错误处理

开始使用

pubspec.yaml文件中添加repo_notifier依赖:

dependencies:
  repo_notifier: ^0.0.1-beta.1

environment:
  sdk: ^3.6.0-334.4.beta  # 需要的SDK版本

使用方法

1. 创建数据模型

class UserDataModel {
  UserDataModel({required this.id, this.name});
  final String id;
  String? name;

  UserDataModel copyWith({String? id, String? name}) {
    return UserDataModel(id: id ?? this.id, name: name ?? this.name);
  }
}

2. 创建仓库

扩展RepoNotifier并指定模型类型和ID类型:

class UserDataRepo extends RepoNotifier<UserDataModel, String> {
  @override
  Future<void> onCreate(UserDataModel data) async {
    // 实现创建逻辑
    await api.createUser(data);
  }

  @override
  Future<void> onUpdate(UserDataModel data) async {
    // 实现更新逻辑
    await api.updateUser(data);
  }

  @override
  Future<void> onDelete([String? id]) async {
    // 实现删除逻辑
    await api.deleteUser(id);
  }

  @override
  Future<UserDataModel> onRead([String? id]) async {
    // 实现读取逻辑
    return await api.getUser(id);
  }
}

3. 在小部件中使用

将小部件树包裹在Subscriber中,并使用模式匹配来处理不同的状态:

class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Subscriber(
      (_) => Scaffold(
        body: userDataRepo.match<Widget>(
          onData: (data) => Text(data.name ?? ''),
          onWaiting: () => CircularProgressIndicator(),
          onError: (error, stack) => Text('Error: $error'),
          onNull: () => Text('No data'),
        ),
      ),
    );
  }
}

4. 执行CRUD操作

// 创建
userDataRepo.create(UserDataModel(id: '1', name: 'John'));

// 读取
userDataRepo.read('1');

// 更新
userDataRepo.update(UserDataModel(id: '1', name: 'Updated Name'));

// 删除
userDataRepo.delete('1');

其他特性

状态模式匹配

match 方法提供了类型安全的模式匹配以处理不同的仓库状态:

userDataRepo.match<Widget>(
  onData: (data) => Text(data.name ?? ''),
  onWaiting: () => CircularProgressIndicator(),
  onError: (error, stack) => Text('Error: $error'),
  onNull: () => Text('No data'),
);

乐观更新

包会维护前一状态,在操作期间允许进行乐观的UI更新:

// 在加载期间,前一数据仍然可访问
userDataRepo.match<Widget>(
  onData: (data) => Text(data.name ?? ''),
  onWaiting: () => Text('Loading...'),
  onNull: () => Text('No data'),
);

更多关于Flutter仓库通知插件repo_notifier的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter仓库通知插件repo_notifier的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,关于Flutter仓库通知插件 repo_notifier 的使用,以下是一个简单的代码案例,展示了如何在Flutter应用中集成和使用这个插件来接收仓库通知。

首先,你需要确保你的Flutter项目已经正确设置,并且已经添加了 repo_notifier 插件。你可以通过在你的 pubspec.yaml 文件中添加以下依赖项来做到这一点:

dependencies:
  flutter:
    sdk: flutter
  repo_notifier: ^latest_version  # 替换为实际的最新版本号

然后运行 flutter pub get 来获取插件。

接下来,在你的Flutter应用中,你可以按照以下步骤使用 repo_notifier 插件:

  1. 初始化插件:在你的主应用文件(例如 main.dart)中,初始化插件并设置通知监听器。
import 'package:flutter/material.dart';
import 'package:repo_notifier/repo_notifier.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Repo Notifier Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  RepoNotifier? _repoNotifier;

  @override
  void initState() {
    super.initState();
    // 初始化RepoNotifier
    _repoNotifier = RepoNotifier(
      token: 'YOUR_GITHUB_PERSONAL_ACCESS_TOKEN',  // 替换为你的GitHub个人访问令牌
      repositories: ['owner1/repo1', 'owner2/repo2'],  // 替换为你想要监控的仓库列表
    );

    // 设置通知监听器
    _repoNotifier!.notificationListener = (notification) {
      // 处理接收到的通知
      print('Received notification: ${notification.toJson()}');
      
      // 可以在这里显示一个Snackbar或者进行其他UI更新
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(
          content: Text('Received new notification: ${notification.title}'),
          action: SnackBarAction(
            label: 'View',
            onPressed: () {
              // 处理点击事件,例如导航到通知详情页面
            },
          ),
        ),
      );
    };

    // 开始监听通知
    _repoNotifier!.startListening();
  }

  @override
  void dispose() {
    // 停止监听通知
    _repoNotifier?.stopListening();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Repo Notifier Demo'),
      ),
      body: Center(
        child: Text('Waiting for notifications...'),
      ),
    );
  }
}

注意

  • 替换 'YOUR_GITHUB_PERSONAL_ACCESS_TOKEN' 为你自己的GitHub个人访问令牌。你可以在GitHub的设置中生成一个新的令牌,并确保它具有读取仓库通知的权限。
  • 替换 ['owner1/repo1', 'owner2/repo2'] 为你想要监控的仓库列表。
  1. 处理权限和安全性:在实际应用中,不要在客户端代码中硬编码GitHub令牌。考虑使用安全的存储方法,如Flutter的 Secure Storage 插件,或者将令牌存储在服务器端,并通过API调用从客户端请求通知。

  2. 错误处理:在实际应用中,添加适当的错误处理逻辑,例如处理网络错误、身份验证错误等。

  3. UI更新:根据具体需求,更新UI以更好地展示通知信息,例如使用列表视图显示最近的通知。

以上代码案例提供了一个基本的框架,展示了如何在Flutter应用中集成和使用 repo_notifier 插件来接收和处理GitHub仓库通知。根据你的具体需求,你可能需要进一步定制和扩展这个示例。

回到顶部