Flutter状态管理插件riverpod_hook_extensions的使用

Flutter状态管理插件riverpod_hook_extensions的使用

Riverpod Hooks ValueNotifier Extensions

Pub GitHub stars

Flutter Riverpod, Hooks和ValueNotifier缺失的扩展。

特性

  • ValueNotifier 扩展
  • StateNotifier 扩展
  • FutureProvider 扩展
  • useGlobalKey 扩展

开始使用

为了使用此包,你需要在pubspec.yaml文件中添加riverpod_hook_extensions作为依赖项。

dependencies:
  riverpod_hook_extensions: <latest_version>

然后,在终端中运行以下命令来添加依赖:

flutter pub add riverpod_hook_extensions

最后,运行flutter pub get以获取包。

文档

更多详细信息,请参阅文档

贡献

欢迎贡献!如果你发现任何问题或有建议,请创建一个新的问题或提交一个拉取请求。

许可证

该项目受MIT许可证保护。

完整示例Demo

接下来,我们将展示如何使用riverpod_hook_extensions进行状态管理。我们将创建一个简单的应用,该应用使用ValueNotifier来管理状态,并通过hooks来监听状态变化。

示例代码

首先,确保你已经在pubspec.yaml文件中添加了riverpod_hook_extensions依赖。

dependencies:
  flutter:
    sdk: flutter
  riverpod: ^1.0.0
  hooks_riverpod: ^1.0.0
  riverpod_hook_extensions: ^1.0.0

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

主要代码

import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:riverpod_hook_extensions/riverpod_hook_extensions.dart';

// 定义一个ValueNotifier
final counterProvider = ValueNotifierProvider((ref) => ValueNotifier(0));

void main() {
  runApp(
    ProviderScope(
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Riverpod Hook Extensions Demo')),
        body: CounterPage(),
      ),
    );
  }
}

class CounterPage extends HookConsumerWidget {
  @override
  Widget build(BuildContext context, ScopedReader watch) {
    // 使用useValueListenable监听counterProvider的变化
    final count = useValueListenable(watch(counterProvider)).value;

    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Text('You have pushed the button this many times:'),
          Text('$count', style: Theme.of(context).textTheme.headline4),
          ElevatedButton(
            onPressed: () {
              // 更新ValueNotifier的值
              context.read(counterProvider).value++;
            },
            child: Text('Increment'),
          ),
        ],
      ),
    );
  }
}

代码解释

  1. 导入必要的库

    import 'package:flutter/material.dart';
    import 'package:hooks_riverpod/hooks_riverpod.dart';
    import 'package:riverpod_hook_extensions/riverpod_hook_extensions.dart';
    
  2. 定义一个ValueNotifierProvider

    final counterProvider = ValueNotifierProvider((ref) => ValueNotifier(0));
    
  3. 主应用入口

    void main() {
      runApp(
        ProviderScope(
          child: MyApp(),
        ),
      );
    }
    
  4. 定义MyApp

    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(title: Text('Riverpod Hook Extensions Demo')),
            body: CounterPage(),
          ),
        );
      }
    }
    
  5. 定义CounterPage

    class CounterPage extends HookConsumerWidget {
      @override
      Widget build(BuildContext context, ScopedReader watch) {
        // 使用useValueListenable监听counterProvider的变化
        final count = useValueListenable(watch(counterProvider)).value;
    
        return Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text('You have pushed the button this many times:'),
              Text('$count', style: Theme.of(context).textTheme.headline4),
              ElevatedButton(
                onPressed: () {
                  // 更新ValueNotifier的值
                  context.read(counterProvider).value++;
                },
                child: Text('Increment'),
              ),
            ],
          ),
        );
      }
    }
    

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

1 回复

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


当然,以下是一个关于如何使用 riverpod_hook_extensions 进行状态管理的 Flutter 代码示例。riverpod_hook_extensions 提供了与 Riverpod 和 Hooks 结合使用的功能,使状态管理更加简洁和高效。

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

dependencies:
  flutter:
    sdk: flutter
  flutter_hooks: ^0.18.0 # 请检查最新版本
  flutter_riverpod: ^1.0.0 # 请检查最新版本
  riverpod_hook_extensions: ^0.3.0 # 请检查最新版本

然后,运行 flutter pub get 以获取这些依赖。

接下来是一个完整的 Flutter 应用示例,展示如何使用 riverpod_hook_extensions 进行状态管理:

import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:riverpod_hook_extensions/riverpod_hook_extensions.dart';

void main() {
  runApp(
    ProviderScope(
      child: MyApp(),
    ),
  );
}

final counterProvider = StateNotifierProvider<CounterNotifier, int>((ref) {
  return CounterNotifier();
});

class CounterNotifier extends StateNotifier<int> {
  CounterNotifier() : super(0);

  void increment() {
    state++;
  }
}

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

class MyHomePage extends HookWidget {
  @override
  Widget build(BuildContext context) {
    // 使用 useProviderHook 获取 counterProvider 的状态
    final counter = useProvider(counterProvider.state);
    
    // 使用 useProviderHook 调用 CounterNotifier 的方法
    final increment = useProvider(counterProvider.notifier).increment;

    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo Home Page'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: increment,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

代码说明:

  1. 依赖注入:使用 ProviderScope 包装整个应用,以确保 Riverpod 的依赖注入正常工作。
  2. 状态管理:创建一个 StateNotifierProvider,它管理一个 CounterNotifier 实例。CounterNotifier 继承自 StateNotifier<int>,并包含一个 increment 方法来更新状态。
  3. 使用 Hooks:在 MyHomePage 中,使用 useProvider Hook 来获取 counterProvider 的状态 (counter) 和 CounterNotifierincrement 方法。
  4. UI 构建:在 UI 中显示当前计数,并提供一个浮动操作按钮(FAB)来增加计数。

通过这种方式,你可以利用 riverpod_hook_extensions 简化状态管理,同时享受 Hooks 带来的便利和可读性。

回到顶部