Open8
Flutterの気になったことをメモする
SizedBox
をまとめたファイルあると便利そう
メリット
- 記述量の削減
- 可読性向上
デメリット
- ファイルの依存関係が増える
- 今までのコードをこれに置き換えるときは大変そう
FlutterCon2023周りで公開されている情報まとめ
ホームページ
公式アプリのリポジトリ
セッションスライド
- Flutter Tips and Tricks リポジトリ
- Exploring Records and Patterns
- From Network Failures to Offrine Success
- Road to 100% Test Coverage
- Rolling in the deep(link) - take a deep dive into Flutter Navigation
- Automate Flutter app releases using Fastlane and Bitrise
- Leaving The Nest -The next 10 year of Flutter-
セッション動画公開されてた
Switch文とSwitch式
書き方紛らわしい
switch文
switch (charCode) {
case slash || star || plus || minus: // 頭にcaseが必要
token = operator(charCode); // breakは必要なし
case comma || semicolon:
token = punctuation(charCode);
case >= digit0 && <= digit9:
token = number();
default: // ワイルドカードは"default"か"_"
throw FormatException('Invalid'); // continue, throw, returnが有効
}
switch式(式文の先頭では使えない)
token = switch (charCode) {
slash || star || plus || minus => operator(charCode), // caseはつけずカンマ区切り
comma || semicolon => punctuation(charCode), // ":"ではなく"=>"
>= digit0 && <= digit9 => number(), // 返すのは単一の式
_ => throw FormatException('Invalid') // ワイルドカードは"_"のみ
};
go_router_builder
go_routerでタイプセーフにパラメータを渡せるようにするためのもの
最近StatefulShellRouteに対応したらしい
Flutter 3.13で追加されたSliverたち
-
SliverMainAxisGroup/SliverCrossAxisGroup
複数のSliverをまとめるもの
MainAxis -> 縦
CrossAxis -> 横 -
SliverCrossAxisExpanded
Expanded同様,flexが指定できるSliver -
SliverConstrainedCrossAxis
子sliverの縦軸方向の幅を指定できるSliver -
DecoratedSliver
文字通りデコレーションできるSliver
公式サンプル
NavigationRailのdestinationsの要素と同列になるようなtrailingの設定方法
class _NavigationRailTrailing extends StatelessWidget {
const _NavigationRailTrailing({
required this.nickname,
required this.iconImageUrl,
required this.onPressed,
});
final String nickname;
final String iconImageUrl;
final VoidCallback? onPressed;
Widget build(BuildContext context) {
final animation = NavigationRail.extendedAnimation(context);
return AnimatedBuilder(
animation: animation,
builder: (context, child) {
return Expanded(
child: Container(
alignment: Alignment.bottomLeft,
padding: const EdgeInsets.only(
bottom: 16,
),
child: InkWell(
onTap: onPressed,
splashFactory: NoSplash.splashFactory,
highlightColor: Colors.transparent,
hoverColor: Colors.transparent,
child: SizedBox(
width: lerpDouble(24, 200, animation.value),
child: Row(
children: [
const Icon(
Icons.account_circle,
size: 24,
),
if (animation.value == 1) ...[
const SizedBox(
width: 28,
),
Text(
nickname,
style: Theme.of(context).textTheme.labelMedium,
),
],
],
),
),
),
),
);
},
);
}
}
参考