[官文翻译]Flutter状态管理库Riverpod - 开始

1,686 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情


Riverpod的官方文档有多国语言,但是没有汉语,所以个人简单翻译了一版。

官网文档:Riverpod

GitHub:GitHub - rrousselGit/river_pod

Pub:riverpod | Dart Package (flutter-io.cn)

译时版本:riverpod 1.0.3


开始

在深入了解 Riverpod 的内部机制之前,我们先从基础开始:安装 RiverPod,然后写一个 “Hello World” 。

安装哪些包

在开始之前,需要意识到 Riverpod 是分布在多个包中,有一些细微的不同用法。

安装 Riverpod 的不同版本取决于开发的应用。

可以参考下表帮助决定使用哪个包:

应用类型包名描述
只有Flutterflutter_riverpod Riverpod 在 flutter 上使用的基本方式。
Flutter + flutter_hookshooks_riverpod同时使用 flutter_hooks 和 Riverpod
只有 Dart (没有 Flutter)riverpod剥离所有 Flutter 相关类的 Riverpod 版本。

安装包

决定了想要安装的包之后,即可添加下面的内容到 pubspec.yaml 中:

  • Flutter + flutter_hooks :

    pubspec.yaml

    environment:
      sdk: ">=2.12.0 <3.0.0"
      flutter: ">=2.0.0"
    
    dependencies:
      flutter:
        sdk: flutter
      flutter_hooks: ^0.18.0
      hooks_riverpod: ^2.0.0-dev.4
    

    之后运行 flutter pub get

  • Flutter

    pubspec.yaml

    environment:
      sdk: ">=2.12.0 <3.0.0"
      flutter: ">=2.0.0"
    
    dependencies:
      flutter:
        sdk: flutter
      flutter_riverpod: ^2.0.0-dev.4
    

    之后运行 flutter pub get

  • Dart only

    pubspec.yaml

    environment:
      sdk: ">=2.12.0-0 <3.0.0"
    
    dependencies:
      riverpod: ^2.0.0-dev.4
    

    之后运行 dart pub get

好了,你已经将 Riverpod 添加到你的应用中了!

用法示例:Hello world

现在我们已经安装了 Riverpod ,可以开始使用它了。

The following snippets showcase how to use our new dependency to make a "Hello world":

下面的代码版本展示了如何使用新的依赖开发一个 "Hello world":

  • Flutter + flutter_hooks

    lib/main.dart

    import 'package:flutter/material.dart';
    import 'package:hooks_riverpod/hooks_riverpod.dart';
    
    // 创建一个 "provider",它会存储一个值 (在这里是 "Hello world")。
    // 通过使用 provider, 这使我们可以模拟/覆写暴露的值。
    final helloWorldProvider = Provider((_) => 'Hello world');
    
    void main() {
      runApp(
        // 为了使组件能读取 provider ,我们需要将整个应用包装在一个 "ProviderScope" 组件中。
        // 这是 provider 的状态要存储的地方。
        ProviderScope(
          child: MyApp(),
        ),
      );
    }
    
    // 注意:MyApp 是一个 HookConsumerWidget,在 hooks_riverpod 包中。
    class MyApp extends HookConsumerWidget {
      @override
      Widget build(BuildContext context, WidgetRef ref) {
        final String value = ref.watch(helloWorldProvider);
    
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(title: const Text('Example')),
            body: Center(
              child: Text(value),
            ),
          ),
        );
      }
    }
    

    运行 flutter run ,会在设备中渲染 "Hello world" 。

  • Flutter

    lib/main.dart

    import 'package:flutter/material.dart';
    import 'package:flutter_riverpod/flutter_riverpod.dart';
    
    // 创建一个 "provider",它会存储一个值 (在这里是 "Hello world")。
    // 通过使用 provider, 这使我们可以模拟/覆写暴露的值。
    final helloWorldProvider = Provider((_) => 'Hello world');
    
    void main() {
      runApp(
        // 为了使组件能读取 provider ,我们需要将整个应用包装在一个 "ProviderScope" 组件中。
        // 这是 provider 的状态要存储的地方。
        ProviderScope(
          child: MyApp(),
        ),
      );
    }
    
    // 继承 ConsumerWidget 而不是 StatelessWidget,它是 Riverpod 中暴露的组件。
    class MyApp extends ConsumerWidget {
      @override
      Widget build(BuildContext context, WidgetRef ref) {
        final String value = ref.watch(helloWorldProvider);
    
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(title: const Text('Example')),
            body: Center(
              child: Text(value),
            ),
          ),
        );
      }
    }
    

    运行 flutter run ,会在设备中渲染 "Hello world" 。

  • Dart only

    lib/main.dart

    import 'package:riverpod/riverpod.dart';
    
    // 创建一个 "provider",它会存储一个值 (在这里是 "Hello world")。
    // 通过使用 provider, 这使我们可以模拟/覆写暴露的值。
    final helloWorldProvider = Provider((_) => 'Hello world');
    
    void main() {
      // 该对象是 provider 的状态要存储的地方。
      final container = ProviderContainer();
    
      // 通过 "container" ,可以读取 provider。
      final value = container.read(helloWorldProvider);
    
      print(value); // Hello world
    }
    

    运行 dart lib/main.dart ,会在控制台打印 "Hello world" 。

更进一步:安装代码片段

如果在使用 Flutter 和 VS Code ,可以考虑使用 Flutter Riverpod 代码片段

如果在使用  Flutter 和 Android Studio 或 IntelliJ,可以考虑使用 Flutter Riverpod 代码片段

img

选择下一步

学习一些基础概念:

跟着手册学习: