INDEX / JOURNAL / LOG-019
VOL. 2026 · ENGINEERING
SERIES 4 / 4
LOG-019 · RIVERPOD AS DI

Riverpod は何を DI しているのか

PUBLISHED
2026 · 10 · 16
AUTHOR
MIGIWAYA
READ
約 7 分
TAGS
#flutter#dart#riverpod

§ 01TOKEN

lib/providers/settings_store_provider.dartDART
final settingsStoreProvider = Provider<SettingsStore>((ref) {
final preferences = ref.watch(preferencesProvider);
return SettingsStore(preferences);
});

§ 02CREATE

lib/providers/preferences_provider.dartDART
final preferencesProvider = Provider<Preferences>((ref) {
final client = ref.watch(storageClientProvider);
return DevicePreferences(client);
});
lib/providers/preferences_provider.dartDART
final preferencesProvider = Provider<Preferences>((ref) {
final value = await SharedPreferences.getInstance(); // 書けない
return DevicePreferences(value);
});

§ 03OVERRIDE

test/settings_store_test.dartDART
final container = ProviderContainer(
overrides: [
clockProvider.overrideWithValue(FixedClock(2026, 10, 16)),
],
);

§ 04ROOT

lib/main.dartDART
void main() {
final clock = SystemClock();
 
runApp(
ProviderScope(
overrides: [clockProvider.overrideWithValue(clock)],
child: const App(),
),
);
}

§ 05AWAIT

lib/providers/preferences_provider.dartDART
final preferencesProvider = FutureProvider<Preferences>((ref) async {
final value = await SharedPreferences.getInstance();
return DevicePreferences(value);
});
lib/preferences/lazy_preferences.dartDART
class LazyPreferences implements Preferences {
Future<SharedPreferences>? _value;
 
Future<SharedPreferences> _load() {
return _value ??= SharedPreferences.getInstance();
}
 
@override
Future<String?> readTheme() async {
return (await _load()).getString('theme');
}
}
lib/providers/preferences_provider.dartDART
final preferencesProvider = Provider<Preferences>((ref) {
throw UnimplementedError('Override preferencesProvider in main()');
});
lib/main.dartDART
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
final value = await SharedPreferences.getInstance();
final preferences = DevicePreferences(value);
 
runApp(
ProviderScope(
overrides: [
preferencesProvider.overrideWithValue(preferences),
],
child: const App(),
),
);
}

§ 06LOCATOR

lib/widgets/checkout_button.dartDART
onPressed: () {
ref.read(checkoutServiceProvider).checkout();
},

§ 07GLOBAL

§ 08SERIES

脚注 · NOTES
  1. [1] ↩
  2. [2] ↩
同シリーズ · Riverpod と依存性注入
§ + RELATED すべて見る →
INQUIRY
CONTACT
LOCATION
STATUS
Active / Open
ESTABLISHED
2024 · 5 · 5
FORM