flutterメモ
Flutter Riverpod 2.0: The Ultimate Guide
いりいろ知らないこともある。
Logging with ProviderObserver とかは便利そう。
AsyncNotifierの使い方。
引数を渡すには、build()
の引数を追加
@riverpod
class SomeOtherController extends _$SomeOtherController {
@override
// you can add named or positional parameters to the build method
Future<String> build(int someValue) async {
final someString = await someFutureThatReturnsAString(someValue);
return anotherFutureThatReturnsAString(someString);
}
// other methods here
}
で、こう使う
// this provider takes a positional argument of type int
final state = ref.watch(someOtherControllerProvider(42));
build完了後のコールバック
WidgetsBinding.instance.addPostFrameCallback((_) {
// build完了後の処理をここに書く
});
go_router や 宣言的Navigationについて
GoRouter内で、Riverpod (ref) を使いたい場合は、Provider で囲む。
とはいえ、async な providerと一緒には使いにくいな。
final routerProvider = Provider(
(ref) => GoRouter(
routes: [
riverdpod や freezed を使っていて build_runner をしたときに、次のエラーが出る場合、
You are missing a required dependency on json_annotation in the "dependencies" section of your pubspec with a lower bound of at least "4.8.0"
次のコマンドで json_annotaionを追加する。
flutter pub add json_annotation
エラーが出ていても動いていたが気持ち悪いので治す。
flutter-web で RefreshIndicator が動かい場合
ページ遷移したときに、 AppBarに 戻る(←)アイコンではなく、閉じる(✕)アイコンを表示したい場合、
GoRoute(
path: 'setting',
builder: (BuildContext context, GoRouterState state) {
return const XXXView();
},
routes: [
GoRoute(
path: 'details',
// pageBuilderを使って、MaterialPage (fullScreenDialog: true) を返す。
pageBuilder: (BuildContext context, GoRouterState state) {
return const MaterialPage(
fullscreenDialog: true,
child: YYYView(),
);
directory 構造について
Android でrelease モードの場合、 "Failed host lookup" エラーが発生する。
AndroidManifest.xml に INTERNETパーミッションを追加する。
<uses-permission android:name="android.permission.INTERNET"/>
debugモードだと、INTERNETパーミッションがついているので問題ない。 不思議だ
go_router で、
/ -- HomeScreen()
details -- DetailsScreen()
/error -- ErrorScreen()
みたいな構造があって、 /error
から /details
に go()
で 遷移すると、
HomeScreen.build()
が呼ばれて、次に DetailsScreen.build()
が呼ばれて、HomeScreen
の上にpush される。
ページがスタックに積まれるからそういうものか。
パフォーマンスが悪化しそうだから、子ページに直接遷移はしないほうがいいのかな。
正規表現で カタカナ判断
\p{Katanakana}
ではなく \p{Script=Katanakana}
と Scripit= が必要。
final re = RegExp(r"\p{Script=Katakana}+", unicode: true);
expect(re.hasMatch('ア'), true);
flutter animation
このシリーズがわかりやすい
ページ遷移アニメーション
Scaffold に ボトムナビゲーションバーするには、
bottomNavigationButton プロパティを使う。
body を ボトムナビゲーションバー の裏に回すようにするには、 extendBody: true をセットする。そして、ボタンの背景色を透明に。
page が現在のtopページかをチェックする。
flutter は、ページ遷移をスタックに積むので、スタックのtopページ以外のページでも、エラーが発生したときに、snackbarなどを表示するとおかしなことになる。
ボディをスクロールすると、appbarの背景色が変わる。の対応
ボディがappbarの裏に回り込むから、色が変わるのだと思う。
scrolledUnderElevation: 0,
ページ遷移の検知はRouteAwareを使う
テーマ、カラースキーム
BoxConstraintの勉強
bitmap を native -> flutter におくる