Flutter核心功能扩展插件fuery_core的使用

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

Flutter核心功能扩展插件fuery_core的使用

特性

  • 异步数据获取、缓存、失效处理和分页
  • 带副作用的突变(Mutation)

安装

pubspec.yaml 文件中添加以下依赖:

flutter pub add fuery_core

基本用法

查询(Query)

查询可以用于从仓库获取数据并将其存储在本地。

int id = 2;

// QueryResult<Post, Error>
late final post = Query.use<Post, Error>(
  queryKey: ['posts', id],
  queryFn: () => repository.getPostById(id),
);

无限查询(Infinite Query)

无限查询用于分页加载数据。

class PageResponse<T> {
  final List<T> items;
  final int? nextCursor;

  PageResponse({
    required this.items,
    this.nextCursor,
  });

  factory PageResponse.fromJson(Map<String, dynamic> map) {
    return PageResponse(
      items: map['items'],
      nextCursor: map['nextCursor'],
    );
  }
}

class NameRepository {
  Future<String> getOne(int id) async {
    return 'Name $id';
  }

  Future<PageResponse<String>> getPage(int page) async {
    return PageResponse(
      items: [
        'Name $page-1',
        'Name $page-2',
        'Name $page-3',
        'Name $page-4',
        'Name $page-5',
      ],
      nextCursor: page + 1,
    );
  }

  Future<String> create(String name) async {
    return name;
  }

  Future<void> removeAll() async {
    // ...
  }
}

final nameRepository = NameRepository();

late final names = InfiniteQuery.use<String, PageResponse<String>, Error>(
  queryKey: ['names', 'list'],
  queryFn: (int page) => nameRepository.getPage(page),
  initialPageParam: 1,
  getNextPageParam: (lastPage, _) => lastPage.data.nextCursor,
);

突变(Mutation)

突变用于对数据进行修改操作。

late final createName = Mutation.use<String, String, Error>(
  mutationFn: (String name) => nameRepository.create(name),
  onSuccess: (_, data) => print('$data created'),
);

// 执行突变操作
createName.mutate('some content');
// 或者
await createName.mutateAsync('some content');

无参数突变(Mutation without parameters)

有时你可能需要一个不带参数的突变。

late final removeAll = Mutation.noParams<String, Error>(
  mutationFn: () => nameRepository.removeAll(),
  onSuccess: (_) => print('all names removed'),
);

// 执行突变操作
removeAll.mutate();
// 或者
await removeAll.mutateAsync();

Fuery客户端(Fuery Client)

Fuery 客户端用于管理查询和突变。

// 使查询失效
Fuery.invalidateQueries(queryKey: ['posts']);

// 配置默认查询选项
Fuery.configQueryOptions(
  query: QueryOptions(...),
  infiniteQuery: InfiniteQueryOptions(...),
);

更多关于Flutter核心功能扩展插件fuery_core的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter核心功能扩展插件fuery_core的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,fuery_core 是一个 Flutter 插件,用于扩展 Flutter 应用的核心功能。虽然具体的插件细节和功能可能依赖于该插件的版本和官方文档,但我可以提供一个基本的示例代码来展示如何使用这个插件(假设它提供了某些核心功能扩展)。

请注意,由于我无法访问实时的 fuery_core 插件代码和文档,以下示例将基于一个假设的插件功能,比如管理应用的全局状态或提供额外的 UI 组件。

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

dependencies:
  flutter:
    sdk: flutter
  fuery_core: ^x.y.z  # 替换为实际的版本号

然后,运行 flutter pub get 来获取依赖。

示例代码

main.dart

import 'package:flutter/material.dart';
import 'package:fuery_core/fuery_core.dart';  // 假设插件提供了这个导入路径

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

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

class FueryCoreDemoScreen extends StatefulWidget {
  @override
  _FueryCoreDemoScreenState createState() => _FueryCoreDemoScreenState();
}

class _FueryCoreDemoScreenState extends State<FueryCoreDemoScreen> {
  // 假设 FueryCore 有一个全局状态管理器
  final FueryCoreStateManager stateManager = FueryCoreStateManager();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Fuery Core Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            // 使用 FueryCore 提供的自定义按钮组件
            FueryCoreButton(
              label: 'Press Me',
              onPressed: () {
                // 更新全局状态
                stateManager.updateState(key: 'counter', value: stateManager.getState('counter')?.toInt() ?? 0 + 1);
                
                // 显示一个 snackbar
                ScaffoldMessenger.of(context).showSnackBar(
                  SnackBar(
                    content: Text('Counter: ${stateManager.getState('counter')}'),
                  ),
                );
              },
            ),
            SizedBox(height: 20),
            Text(
              'Counter: ${stateManager.getState('counter')}',
              style: TextStyle(fontSize: 24),
            ),
          ],
        ),
      ),
    );
  }
}

// 假设 FueryCoreStateManager 是插件提供的一个全局状态管理器类
class FueryCoreStateManager {
  Map<String, dynamic> _state = {};

  void updateState({required String key, required dynamic value}) {
    setState(() {
      _state[key] = value;
    });
  }

  dynamic getState(String key) {
    return _state[key];
  }

  // 注意:这里的 setState 是一个假设的方法,实际插件可能提供不同的机制来通知状态变化
  // 如果插件没有提供自动通知机制,你可能需要使用 Flutter 的 Provider 或其他状态管理库来实现
  void setState(VoidCallback fn) {
    // 在实际使用中,这里应该触发 UI 的重建,具体实现依赖于插件的设计
  }
}

// 假设 FueryCoreButton 是插件提供的一个自定义按钮组件
class FueryCoreButton extends StatelessWidget {
  final String label;
  final VoidCallback? onPressed;

  const FueryCoreButton({Key? key, required this.label, this.onPressed}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: onPressed,
      child: Text(label),
    );
    // 注意:这里使用了 Flutter 的 ElevatedButton 作为示例,实际插件可能提供了不同的按钮实现
  }
}

说明

  1. 全局状态管理:假设 FueryCoreStateManager 是插件提供的一个全局状态管理器,用于存储和更新应用状态。
  2. 自定义组件:假设 FueryCoreButton 是插件提供的一个自定义按钮组件。
  3. 状态更新和UI反馈:点击按钮时,更新全局状态,并通过 Snackbar 显示更新后的状态。

注意事项

  • 由于 fuery_core 是一个假设的插件,上述代码中的类和方法名(如 FueryCoreStateManagerFueryCoreButton)可能并不存在于实际的插件中。
  • 实际的插件可能有自己的状态管理机制和自定义组件,具体使用方式请参考插件的官方文档和示例代码。
  • 如果插件没有提供自动的状态通知机制,你可能需要结合 Flutter 的其他状态管理库(如 Provider、Riverpod 等)来实现全局状态管理。
回到顶部