LogoSkills

riverpod-getting-started

Install Riverpod (flutter_riverpod or riverpod), wrap the app in ProviderScope, run a hello-world provider, and optionally enable riverpod_lint and code generation. Use when starting a Flutter or D...

Riverpod โ€” Getting Started#

ํ•œ๋งˆ๋””๋กœ (๋น„๊ฐœ๋ฐœ์ž์šฉ)#

Riverpod์€ ์•ฑ ์•ˆ์—์„œ ์—ฌ๋Ÿฌ ํ™”๋ฉด์ด ํ•จ๊ป˜ ์“ฐ๋Š” ์ •๋ณด(์˜ˆ: ๋กœ๊ทธ์ธ ์ƒํƒœ, ์‚ฌ์šฉ์ž ์ด๋ฆ„)๋ฅผ ํ•œ๊ณณ์— ๊น”๋”ํ•˜๊ฒŒ ๋ณด๊ด€ํ•˜๊ณ  ๋‚˜๋ˆ  ์“ฐ๊ฒŒ ํ•ด ์ฃผ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๋งˆ์น˜ ์ง‘ ์•ˆ ๊ณณ๊ณณ์— ์ฝ˜์„ผํŠธ๋ฅผ ๊น”์•„ ๋‘๊ณ  ํ•„์š”ํ•œ ๊ฐ€์ „์ œํ’ˆ์ด ์–ด๋””์„œ๋“  ์ „๊ธฐ๋ฅผ ๋Œ์–ด ์“ฐ๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ์ด ์Šคํ‚ฌ์€ ๊ทธ ์ฝ˜์„ผํŠธ(Riverpod)๋ฅผ ์ฒ˜์Œ ์„ค์น˜ํ•˜๊ณ , ์ „์›์„ ์ผœ๊ณ , ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ "Hello world" ์˜ˆ์ œ๋ฅผ ๋Œ๋ ค ๋ณด๋Š” ์ฒซ๊ฑธ์Œ์„ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.

๋ฌด์—‡์„ยท์–ธ์ œ (๋น„๊ฐœ๋ฐœ์ž์šฉ)#

  • ๋ฌด์—‡์„ ํ•ด ์ฃผ๋‚˜์š”
    • ์•ฑ ํ”„๋กœ์ ํŠธ์— Riverpod ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค(Flutter์šฉ ๋˜๋Š” ์ˆœ์ˆ˜ Dart์šฉ).
    • ์•ฑ ์ „์ฒด๋ฅผ ProviderScope๋กœ ๊ฐ์‹ธ์„œ ์–ด๋””์„œ๋“  ์ •๋ณด๋ฅผ ๊บผ๋‚ด ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.
    • ๊ฐ€์žฅ ๊ธฐ์ดˆ์ ์ธ ์˜ˆ์ œ("Hello world")๋ฅผ ๋งŒ๋“ค์–ด ์ •์ƒ ๋™์ž‘์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    • ํ•„์š”ํ•˜๋ฉด ์ฝ”๋“œ ์ž๋™ ์ƒ์„ฑ๊ณผ ์ฝ”๋“œ ์ ๊ฒ€(linter) ๊ธฐ๋Šฅ๊นŒ์ง€ ์ผœ ์ค๋‹ˆ๋‹ค.
  • ์–ธ์ œ ์“ฐ๋‚˜์š”
    • Flutter ๋˜๋Š” Dart ํ”„๋กœ์ ํŠธ๋ฅผ Riverpod์œผ๋กœ ์ƒˆ๋กœ ์‹œ์ž‘ํ•  ๋•Œ
    • ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์— Riverpod์„ ์ฒ˜์Œ ์ถ”๊ฐ€ํ•  ๋•Œ
    • ProviderScope์™€ ์ฒซ ๋ฒˆ์งธ provider๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•  ๋•Œ

ํ•ต์‹ฌ ์šฉ์–ด (๋น„๊ฐœ๋ฐœ์ž์šฉ)#

์šฉ์–ด์‰ฌ์šด ์„ค๋ช…
Riverpod์•ฑ์ด ๊ณต์œ ํ•˜๋Š” ์ •๋ณด๋ฅผ ํ•œ๊ณณ์—์„œ ๊ด€๋ฆฌํ•˜๊ณ  ๋‚˜๋ˆ  ์“ฐ๊ฒŒ ํ•ด ์ฃผ๋Š” ๋„๊ตฌ(์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)
Flutter / Dart์•ฑ์„ ๋งŒ๋“œ๋Š” ๋ฐ ์“ฐ๋Š” ๊ธฐ์ˆ . Dart๋Š” ์–ธ์–ด, Flutter๋Š” ๊ทธ ์œ„์—์„œ ํ™”๋ฉด์„ ๋งŒ๋“œ๋Š” ๋„๊ตฌ
ํŒจํ‚ค์ง€(package)๋‚จ์ด ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋‘” ๊ธฐ๋Šฅ ๋ฌถ์Œ. ์„ค์น˜ํ•ด์„œ ๊ฐ€์ ธ๋‹ค ์“ฐ๋Š” ๋ถ€ํ’ˆ
ProviderScope์•ฑ ์ „์ฒด๋ฅผ ๊ฐ์‹ธ ์ •๋ณด๋ฅผ ์–ด๋””์„œ๋“  ๊บผ๋‚ด ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ฃผ๋Š” "์ฝ˜์„ผํŠธ ๋ฐฐ์ „๋ฐ˜"
provider์ •๋ณด ํ•œ ์กฐ๊ฐ์„ ๋ณด๊ด€ํ•˜๊ณ  ํ•„์š”ํ•  ๋•Œ ๋‚ด์–ด ์ฃผ๋Š” "์ฝ˜์„ผํŠธ" ํ•˜๋‚˜
์ฝ”๋“œ ์ƒ์„ฑ(code generation)๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์‚ฌ๋žŒ์ด ์ง์ ‘ ์•ˆ ์“ฐ๊ณ  ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๊ธฐ๋Šฅ
linter (riverpod_lint)์ฝ”๋“œ์—์„œ ์‹ค์ˆ˜๋‚˜ ์•ˆ ์ข‹์€ ์Šต๊ด€์„ ์ž๋™์œผ๋กœ ์งš์–ด ์ฃผ๋Š” ๊ฒ€์‚ฌ๊ธฐ
Hello world์ƒˆ ๋„๊ตฌ๊ฐ€ ์ž˜ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์ฒซ ์˜ˆ์ œ

Instructions#

Installing the package#

Riverpod is available as a main package (Flutter: flutter_riverpod; Dart-only: riverpod). Optional packages add code generation and hooks.

Flutter:

flutter pub add flutter_riverpod

With code generation:

flutter pub add flutter_riverpod riverpod_annotation
flutter pub add dev:riverpod_generator build_runner

Dart only:

dart pub add riverpod

With code generation:

dart pub add riverpod riverpod_annotation
dart pub add dev:riverpod_generator build_runner

Manual pubspec.yaml (Flutter):

dependencies:
  flutter:
    sdk: flutter
  flutter_riverpod: ^2.0.0  # use latest from pub.dev

dev_dependencies:
  build_runner:
  riverpod_generator: ^2.0.0  # if using code generation

Then run flutter pub get (or dart pub get for Dart-only).

If using code generation, run:

dart run build_runner watch -d

Note: Some Riverpod packages may require Flutter's beta channel for compatibility with latest json_serializable. If pub get fails, try flutter channel beta or use Riverpod <=3.1.0.

Wrap the app in ProviderScope#

Widgets need a ProviderScope (Flutter) or a ProviderContainer (Dart) to read providers.

Flutter โ€” ProviderScope:

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

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

Dart only โ€” ProviderContainer:

final container = ProviderContainer();
final value = container.read(helloWorldProvider);
print(value);
// Don't forget to container.dispose() when done

Hello world (Flutter with code generation)#

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';

part 'main.g.dart';

@riverpod
String helloWorld(Ref ref) {
  return 'Hello world';
}

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

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)),
      ),
    );
  }
}

Run dart run build_runner build (or watch) to generate main.g.dart. Without code generation, use a manual provider (e.g. final helloWorldProvider = Provider<String>((ref) => 'Hello world');) and the same ProviderScope + ConsumerWidget pattern.

Enabling riverpod_lint#

Add the optional linter via analysis_options.yaml:

plugins:
  riverpod_lint: ^2.0.0  # use latest from https://pub.dev/packages/riverpod_lint

This provides lint rules and refactorings for Riverpod. See the riverpod_lint package page for the full list.

Going further#

  • Code generation and hooks: See the riverpod-codegen-and-hooks skill (or docs: About code generation, About hooks).
  • VS Code / Android Studio: Consider Flutter Riverpod Snippets extensions for faster boilerplate.