Flutter状态管理插件hooks_riverpod的使用

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

Flutter状态管理插件hooks_riverpod的使用

介绍

Riverpod 是一个响应式的缓存和数据绑定框架,它简化了与异步代码的工作。它通过以下方式来提升开发体验:

  • 默认处理错误/加载状态。无需手动捕获错误。
  • 原生支持高级场景,如下拉刷新。
  • 将逻辑从UI中分离出来。
  • 确保代码可测试、可扩展且可重用。

Flutter Favorite

包名 版本
riverpod
flutter_riverpod
hooks_riverpod

更多关于 Riverpod 的信息,请访问 官方网站

使用示例

定义网络请求

@riverpod
Future<String> boredSuggestion(Ref ref) async {
  final response = await http.get(
    Uri.https('boredapi.com', '/api/activity'),
  );
  final json = jsonDecode(response.body);
  return json['activity']! as String;
}

监听网络请求并在UI中处理结果

class Home extends ConsumerWidget {
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final boredSuggestion = ref.watch(boredSuggestionProvider);
    // Perform a switch-case on the result to handle loading/error states
    return switch (boredSuggestion) {
      AsyncData(:final value) => Text('data: $value'),
      AsyncError(:final error) => Text('error: $error'),
      _ => const Text('loading'),
    };
  }
}

完整示例:计数器应用

这是一个完整的示例,展示了如何使用 hooks_riverpod 创建一个简单的计数器应用程序。

主文件 main.dart

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

void main() {
  runApp(
    /// [MyApp] is wrapped in a [ProviderScope].
    /// This widget is where the state of most of our providers will be stored.
    /// This replaces `MultiProvider` if you've used `provider` before.
    const ProviderScope(
      child: MyApp(),
    ),
  );
}

/// A provider that creates and listen to a [StateNotifier].
///
/// Providers are declared as global variables.
/// This does not hinder testability, as the state of a provider is instead
/// stored inside a [ProviderScope].
final counterProvider = StateNotifierProvider<Counter, int>((_) => Counter());

/// A simple [StateNotifier] that implements a counter.
///
/// It doesn't have to be a [StateNotifier], and could be anything else such as:
/// - [ChangeNotifier], with [ChangeNotifierProvider]
/// - [Stream], with [StreamProvider]
/// ...
class Counter extends StateNotifier<int> {
  Counter() : super(0);

  void increment() => state++;
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends HookConsumerWidget {
  const MyHomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Riverpod counter example'),
      ),
      body: Center(
        // HookConsumer is a builder widget that allows you to read providers and utilise hooks.
        child: HookConsumer(
          builder: (context, ref, _) {
            final count = ref.watch(counterProvider);

            return Text(
              '$count',
              style: Theme.of(context).textTheme.headlineMedium,
            );
          },
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => ref.read(counterProvider.notifier).increment(),
        child: const Icon(Icons.add),
      ),
    );
  }
}

总结

hooks_riverpod 提供了一种强大的状态管理解决方案,适用于各种复杂的应用场景。通过定义提供者(Provider),我们可以轻松地将业务逻辑与UI分离,并确保代码的可维护性和可测试性。上述示例展示了如何创建一个简单的计数器应用,希望对您有所帮助!


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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用hooks_riverpod进行状态管理的代码示例。hooks_riverpod是Riverpod与Flutter Hooks的结合,提供了一种简洁而强大的方式来管理状态。

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

dependencies:
  flutter:
    sdk: flutter
  hooks_riverpod: ^x.x.x  # 请替换为最新版本号
  flutter_hooks: ^x.x.x    # 请替换为最新版本号

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

接下来,我们将创建一个简单的示例,演示如何使用hooks_riverpod来管理一个计数器状态。

  1. 创建一个Riverpod Provider

首先,我们创建一个provider.dart文件来定义我们的状态提供者:

import 'package:flutter_riverpod/flutter_riverpod.dart';

final counterProvider = StateProvider<int>((ref) {
  return 0; // 初始值
});
  1. 设置Riverpod

在你的main.dart文件中,确保你使用了ProviderScope来包裹你的应用:

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'provider.dart';
import 'counter_screen.dart';

void main() {
  runApp(
    ProviderScope(
      child: MaterialApp(
        home: CounterScreen(),
      ),
    ),
  );
}
  1. 创建UI组件

现在,我们创建一个counter_screen.dart文件,其中包含我们的UI组件:

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

class CounterScreen extends HookWidget {
  @override
  Widget build(BuildContext context) {
    final counter = useProvider(counterProvider.state);

    return Scaffold(
      appBar: AppBar(
        title: Text('Hooks Riverpod Counter'),
      ),
      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: () {
          context.read(counterProvider.notifier).state++;
        },
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

在这个示例中,我们使用了useProvider钩子来访问counterProvider的状态,并使用context.read(counterProvider.notifier).state++来增加计数器的值。

  1. 运行应用

现在,你可以运行你的Flutter应用,应该会看到一个简单的计数器应用,点击浮动操作按钮(FAB)会增加计数器的值。

这个示例展示了如何使用hooks_riverpod进行基本的状态管理。你可以根据需要扩展这个示例,添加更多的状态和逻辑。hooks_riverpod提供了许多强大的功能,比如依赖注入、监听提供者变化等,这些都可以在你的应用中进一步探索和使用。

回到顶部