Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Flutterハンズオン 2
Search
Aya Ebata
August 19, 2024
Technology
110
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Flutterハンズオン 2
Aya Ebata
August 19, 2024
More Decks by Aya Ebata
See All by Aya Ebata
JEP 526: Lazy Constants
aya_ebata
0
59
Flutterハンズオン 5
aya_ebata
0
97
JEP 480: Structured Concurrency
aya_ebata
0
290
Flutterハンズオン 4
aya_ebata
0
170
Flutterハンズオン 3
aya_ebata
0
100
Flutterハンズオン 1
aya_ebata
0
140
あたらしい もじれつの かきかた
aya_ebata
0
140
社内勉強会vol.3@ごーふぁー荘
aya_ebata
0
800
社内勉強会vol.2@ごーふぁー荘
aya_ebata
1
810
Other Decks in Technology
See All in Technology
実装は速くなった、レビューはどうする? ― 自身のレビューをAIで再現させるサーヴァントエンジニアリングのすゝめ / Implementation got faster. So what about reviews? — An invitation to Servant Engineering: Recreating your own code reviews with AI
nrslib
7
3.9k
AIプラットフォームを運用し続けるための可観測性
tanimuyk
4
1.1k
Databricks 月刊サービスアップデート 2026年05月号
tyosi1212
0
210
製造業のクラウド活用最適解〜AI,DXを加速するデータ基盤の作り方〜
hamadakoji
0
390
AI-DLCを活用した高品質・安全なAI駆動開発実践 / AI Driven Development with AI-DLC
yoshidashingo
0
140
Dynamic Workersについて
yusukebe
2
590
美味しいスイスチーズを作ろう🧀🐭
taigamikami
1
240
AI Engineering Summit Tokyo 2026 AIの前に、やることがある 〜医療データ企業の4フェーズ〜
dtaniwaki
0
1.9k
noUncheckedIndexedAccess、3時間、1万円。 / noUncheckedIndexedAccess, 3 Hours, 10,000 JPY.
kaonavi
1
310
AI駆動開発が変える、大規模開発の前提 ーHuman in the Loop から Human on the Loop へ / AIE2026
visional_engineering_and_design
16
8.5k
タクシーアプリ『GO』の実践的データ活用
mot_techtalk
3
150
EventBridge Connection
_kensh
4
570
Featured
See All Featured
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
140
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
23k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
320
Building Adaptive Systems
keathley
44
3k
Testing 201, or: Great Expectations
jmmastey
46
8.2k
So, you think you're a good person
axbom
PRO
2
2.1k
Odyssey Design
rkendrick25
PRO
2
690
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
200
Information Architects: The Missing Link in Design Systems
soysaucechin
0
960
Design in an AI World
tapps
1
220
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
600
Transcript
Flutterハンズオン 2 2024/08/20 社内勉強会 えばた あや
今日話すこと 1. Dartとは? 2. Dartの基礎構文 前半 - 変数 - 制御フロー文
- 関数 - ★練習問題
1. Dartとは?
Dartとは - Googleによって開発された言語 - あらゆるプラットフォームで高速なアプリケーションを開発するために 最適化された言語 - オブジェクト指向、クラスベース、ガベージコレクションを備えた、 Cスタイルの構文を持つ -
ネイティブコードまたはJavaScriptにコンパイルできる
Dartとは - JavaScriptの代替となることを目的に作られた - 型は必須だけど、型推論 -> 型安全 - nullを許可しない限り、値はnullにできない ->
null安全
2. Dartの基礎構文 前半
Dartの基礎構文 手元で試しながら学んでいきましょう〜! DartPad https://dartpad.dev/ ご自身で入れたエディタでもOK!
Dartの基礎構文 こちらのページに載っている構文を見ていきます! https://dart.dev/language
Hello World - main関数から実行される - print関数を使う void main() { print('Hello,
World!'); }
変数 - 変数はvarで宣言できる - この場合、型推論になる - シングルクォーテーションが標準 var name =
'Voyager I'; var year = 1977; var antennaDiameter = 3.7;
変数 - ListやMapは感覚的にかける var flybyObjects = ['Jupiter', 'Saturn', 'Uranus', 'Neptune'];
var image = { 'tags': ['saturn'], 'url': '//path/to/saturn.jpg' };
変数 - 型を明示的に書くこともできる - Object型は型の制限がない場合に使用 String name = 'Bob'; Object
name = 'Bob';
変数 - 型の後ろに?を追加するとnullableになる String? name; print(name); // nullが出力される String name
= null; // エラーになる
変数 - intで宣言をした後に数値を入れないと怒られる - non-nullableのため int num; num = 2;
print(num);
late - 遅延初期化 - 変数の宣言後に初期化される late String description; void main()
{ description = 'Feijoada!'; // ここでdescriptionを初期化 print(description); }
late - 宣言時に初期値を書くことができる - 変数が使用されない場合は初期化されない late String temperature = readThermometer();
final - 変数を変更する予定がない場合 - 実行時に値を確定する final name = 'Bob'; //
Without a type annotation final String nickname = 'Bobby';
定数 - constを使用する - 値の変更はできない - コンパイル時に値を確定する const bar =
1000000; // Unit of pressure (dynes/cm2) const double atm = 1.01325 * bar; // Standard atmosphere
if if (year >= 2001) { print('21st century'); } else
if (year >= 1901) { print('20th century'); }
for for (var i = 1; i <= 10; i++)
{ print(i); } var collections = [1, 2, 3]; for (final collection in collections) { print(collection); }
forEach var collection = [1, 2, 3]; collection.forEach((val) => print(val));
// 1 2 3 // 以下は省略した書き方 collection.forEach(print);
while while (year < 2016) { year += 1; }
練習問題1 import 'dart:math'; void main() { // 1. Stringのresult変数を定義する //
以下はtrue/falseをランダムに生成するメソッド var random = Random().nextBool(); // 2. もしrandom変数がtrueならresult変数に「結果はtrueです」を // 入れ、falseなら「結果はfalseです」を入れる // 3. result変数を出力する }
練習問題1 解答例 import 'dart:math'; void main() { String result; var random
= Random().nextBool(); if (random) { result = '結果はtrueです'; } else { result = '結果はfalseです'; } print(result); }
関数 - 戻り値の型は関数名の頭にて指定できる - 戻り値の型は省略可能だが、公式は指定することを勧めている int fibonacci(int n) { if
(n == 0 || n == 1) return n; return fibonacci(n - 1) + fibonacci(n - 2); } var result = fibonacci(20);
関数の短縮構文 - 処理が1行しかない関数の場合は書き方を省略できる bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;
名前付き引数 - {}を使って指定することで、関数呼び出し時に引数名を指定できる - 引数に何も指定しない場合はオプショナルになるので?が必要 void enableFlags({bool? bold, bool? hidden})
{...} enableFlags(bold: true, hidden: false); enableFlags(bold: true); // hiddenはnullになる
名前付き引数 - 引数にデフォルト値を指定できる - その場合は何かしら値が入るのでnon-nullableになる void enableFlags({bool bold = false,
bool hidden = false}) { … } enableFlags(bold: true); // hiddenにはfalseが入る
名前付き引数 - requiredをつけると関数呼び出し時に名前付き引数での呼び出しが必須 になる void enableFlags( {required bool bold, required
bool hidden} ) {...} enableFlags(bold: true, hidden: false); enableFlags(bold: true); // hiddenがないので怒られる
名前付き引数 - requiredと?を使用することで名前付き引数が必須でnullを許可できる void enableFlags( {required bool? bold, required bool?
hidden} ) {...} enableFlags(bold: null, hidden: null);
Optional positional parameters - []で囲むとオプショナルな引数になる String say(String from, String msg,
[String? device]) { var result = '$from says $msg'; if (device != null) { result = '$result with a $device'; } return result; } say('Bob', 'Howdy'); // 「Bob says Howdy」が返却される say('Bob', 'Howdy', 'smoke signal'); // 「Bob says Howdy with a smoke signal」が返却される
第一級オブジェクト - 関数を別の関数のパラメータとして渡すことができる void printElement(int element) { print(element); } var
list = [1, 2, 3]; list.forEach(printElement); // 以下と同じ意味になる list.forEach((val) => printElement(val));
無名関数 - 以下でいうと、mapの中身が無名関数 const list = ['apples', 'bananas', 'oranges']; var
uppercaseList = list.map((item) { return item.toUpperCase(); }).toList();
無名関数 - 処理が1つしかない場合は、=>でreturnを省略できる ※ 文字列に変数やメソッドを埋め込む際は$を使用する var uppercaseList = list .map((item)
=> item.toUpperCase()) .toList(); uppercaseList.forEach( (item) => print('$item: ${item.length}') );
複数の値を返す関数 - カッコで指定する (String, int) foo() { return ('something', 42);
}
練習問題2 - 関数を使って、lateが遅延初期化していることを確認する String getOrder() { // 1. 「注文が入りました」と出力する //
2. 「ラーメン」を返却する } void main() { // 3. late変数orderを定義、初期値はgetOrder関数を指定 // 4. order変数を出力する }
練習問題2 解答例 - 関数を使って、lateが遅延初期化していることを確認する String getOrder() { print('注文が入りました'); return 'ラーメン'; }
void main() { late var order = getOrder(); print(order); }
練習問題2 遅延初期化の確認 - 関数を使って、lateが遅延初期化していることを確認する void main() { // 1. lateを削除して実行 ->
出力されるものを確認 late var order = getOrder(); // 2. 以下をコメントアウトして実行 -> 出力されるものを確認 print(order); // 3. order変数にまたlateをつけて実行 -> 出力されるものを確認 }
練習問題3 // 1. 以下の条件を持つ、intを返却するadd関数を作成する // - 名前付き引数 // - intの引数first、関数を呼び出す際に指定必須
// - intの引数second、nullable // - intの引数third、デフォルト値が10 // - first、second、thirdを足した数を返却する
練習問題3 void main() { // 2. 以下がエラーなく実行できることを確認する print(add(first: 1, second:
2, third: 3)); print(add(first: 1, second: 2)); print(add(first: 1)); }
練習問題3 解答例 int add({required int first, int? second, int third =
10}) { return first + (second != null ? second : 0) + third; }
練習問題3 解答例 void main() { print(add(first: 1, second: 2, third: 3));
// 6 print(add(first: 1, second: 2)); // 13 print(add(first: 1)); // 11 }
練習問題4 // 1. 以下を満たす関数を作成する void main() { ramen('硬め', '濃いめ', '多め');
// 「麺: 硬め, 味: 濃いめ, 油: 多め」が出力される ramen(); // 「麺: 普通, 味: 普通, 油: 普通」が出力される }
練習問題4 解答例 void ramen([ String noodle = '普通', String taste =
'普通', String oil = '普通' ]) { print('麺: $noodle, 味: $taste, 油: $oil')); }
練習問題5 void main() { // 1. 好きな数値を羅列したList型のlist定数を定義する // 2. 無名関数を用いてlistの各値に10を掛けた値を出力する
}
練習問題5 解答例1 - 10を掛けた値を毎回出力する例 void main() { const list = [1,
2, 3]; list.forEach((item) => print(item * 10)); }
練習問題5 解答例2 - 10を掛けたListを作成し、最後に出力をする例 void main() { const list = [1,
2, 3]; var addedList = list.map((item) => item * 10).toList(); print(addedList); }
まとめ - Dartの変数や制御フロー文は直感的でわかりやすい - 関数の書き方が複数あり少し複雑