🫧
Dart3のsealed + pattern matchingでおみくじを作ってみた!
対象者
- Dart3に興味がある人.
- sealed + pattern matchingを使ってみたい人.
やること/やらないこと
やること:
- ビジネスロジックを学ぶ.
- sealed classの活用例を学んでみる.
やらないこと:
- Dart3の文法についてすご〜く深掘りしない.
プロジェクトの説明
Dart3の新しい文法であるsealed class
をswitch
と組み合わせて条件によって、継承したクラスのゲッターの値を返すロジックを作ってみた。
ランダムな数値を渡して、渡された引数によって、パターンに合わせてクラスのゲッターの値を返す。これを後で、FlutterのWidgetを切り替えるロジックとして使います。
import 'dart:math';
sealed class Fortune {
String get name;
}
class GreatLuck implements Fortune {
String get name => "大吉";
}
class MiddleLuck implements Fortune {
String get name => "中吉";
}
class SmallLuck implements Fortune {
String get name => "小吉";
}
class BadLuck implements Fortune {
String get name => "凶";
}
class BigBadLuck implements Fortune {
String get name => "大凶";
}
// pattern matching
void main() {
final random = Random().nextInt(10);
print('ランダムな数字は: $random');
var isRandom = switch (random) {
1 || 2 => GreatLuck(),
3 => MiddleLuck(),
4 || 5 => SmallLuck(),
6 || 7 || 8 => SmallLuck(),
9 || 10 => BigBadLuck(),
_ => throw Exception('Unknown animal'),
};
print('今日の運勢は: ${isRandom.name}');
}
Flutterで再現するとこんな感じになりました!
こちらがサンプルコード
Dart3のシールドクラスなるものを使って、enumのように定数のようなものを定義しておきます。
おみくじのクラス
const/foturne.dart
sealed class Fortune {
String get name;
}
class GreatLuck implements Fortune {
String get name => "大吉";
}
class MiddleLuck implements Fortune {
String get name => "中吉";
}
class SmallLuck implements Fortune {
String get name => "小吉";
}
class BadLuck implements Fortune {
String get name => "凶";
}
class BigBadLuck implements Fortune {
String get name => "大凶";
}
class NoLuck implements Fortune {
String get name => "何もないよ!";
}
FloatingActionButton
を押すと、random
という変数に新しい乱数を代入して、画面が更新されるたびに、実行されている関数の戻り値が変わって、大吉
とか大凶
って表示されます。
switch使ったfunctionですけど、_ =>
を書かないとエラーになります。0とかエラーの場合は値を返す処理を書いてねってことみたいです。でもthrowを使うエラーが出ます!
おみくじアプリ
import 'dart:math';
import 'package:flutter/material.dart';
import 'const/fortune.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int random = Random().nextInt(10);
Fortune isRandom() {
var isRandom = switch (random) {
1 || 2 => GreatLuck(),
3 || 4 => MiddleLuck(),
5 || 6 => SmallLuck(),
7 || 8 => SmallLuck(),
9 || 10 => BigBadLuck(),
_ => NoLuck(),
};
return isRandom;
}
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.yellow[50],
appBar: AppBar(
title: const Text("おみくじアプリ"),
flexibleSpace: Container(
decoration: const BoxDecoration(
gradient: LinearGradient(
colors: [Colors.blueAccent, Colors.red] //グラデーションの設定
)),
),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
isRandom().name,
style: const TextStyle(
fontSize: 50,
fontWeight: FontWeight.bold,
color: Colors.deepPurple,)
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
setState(() {
random = Random().nextInt(10);
});
},
tooltip: 'Increment',
child: const Icon(Icons.add),
),
);
}
}
感想
今回は、Dart3のsealed + pattern matching
でおみくじアプリのビジネスロジックを作ってみました。久しぶりにDartの基本的な文法の学習をする本を読んでみて、Dart3でなんか作りたいな〜と思って初心者が練習で作るおみくじを作ってみました🧡💙💛
Discussion