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 におくる