Provider
は親のWidgetからProvider<T>.value()
でデータを飛ばして、子Widget内でProvider.of<T>()
を使用しキャッチするFlutter
の状態を管理するパッケージとは違い、
Shared preferences pluginは
prefs.setXXXXX('key', 保存する値);
で保存したものをprefs.getXXXXX('key')
で取り出すことができます。
XXXXXにはそれぞれ型があり、
XXXXXに入る型 | SET(保存) | GET(取得) |
---|---|---|
int型 | setInt('i', 1) | getInt('i') |
bool型 | setBool('b', true) | getBool('b') |
double型 | setDouble('d', 0.5) | getDouble('d') |
string型 | setString('s', 'abc') | getString('s') |
list型 | setStringList('l', ['abc', 'efg', 'hij']) | getStringList('l') |
を適用。使用例として、
import 'dart:async';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:shared_preferences/shared_preferences.dart';
// getInstance()はFuture型を返すのでasync awaitさせる
Future<double> getDoubleState() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
double isDouble = await prefs.getDouble("double") ?? 0.0;
print(isDouble);
return isDouble;
}
Future<bool> getBoolState() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
bool isBool = await prefs.getBool("bool") ?? true;
print(isBool);
return isBool;
}
Future<double> saveDoubleState(double value) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setDouble("double", value);
print('saved $value');
return value;
}
Future<bool> saveBoolState(bool value) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setBool("bool", value);
print('saved $value');
return prefs.setBool("bool", value);
}
class BoolAndDouble extends HookConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final snapShotdouble = useMemoized(() => getDoubleState());
var d = useFuture(snapShotDouble);
final doubleValue = useState<double>(0.1);
useEffect(() {
if (d.hasData) {
doubleValue.value = d.data!;
}
return null;
}, [d.data]);
final snapShotBool = useMemoized(() => getBoolState());
var b = useFuture(snapShotBool);
final boolValue = useState<bool>(true);
useEffect(() {
if (b.hasData) {
boolValue.value = b.data!;
}
return null;
}, [b.data]);
で、useState
のvalueを渡します。