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 × GraphQLでアプリを作ってみる
Search
Yohei Iino
February 23, 2024
Technology
350
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Flutter × GraphQLでアプリを作ってみる
Yohei Iino
February 23, 2024
More Decks by Yohei Iino
See All by Yohei Iino
1年半放置したExpo製アプリを最新化してみた
wheatandcat
0
120
作成中のFlutterアプリの中間発表
wheatandcat
0
95
最近読んだ技術書を簡単紹介
wheatandcat
0
120
ユニバーサルリンク/アプリリンクを使ってQRコードでゲストログインできるようにする
wheatandcat
0
390
Firebase App Checkを実装したので紹介
wheatandcat
0
340
PlanetScaleの無料プランがなくなるので、NeonとTiDBを試してみた
wheatandcat
0
430
Flutter HooksとRiverpodの解説
wheatandcat
0
590
T3 Stack(応用編: Next Auth & SSRの実装紹介)
wheatandcat
1
420
App Routerの紹介
wheatandcat
0
160
Other Decks in Technology
See All in Technology
多層防御と最⼩権限で実現する、安全なAIエージェント設計パターン
lycorptech_jp
PRO
0
210
Where Is JetBrains AI Heading- — Central CLI, Air Alpha, and the Agentic Development Stack
x5gtrn
PRO
0
140
AIエージェントの開発・提供におけるセキュリティリスクの論点と対策
flatt_security
2
600
V8コントリビュート超入門
riyaamemiya
0
150
Multica × 長期記憶:40個のミニプロジェクト管理
eiei114
1
200
AI時代のAPI品質を支えるガードレール / API Guardrails for API quality in the AI era
yokawasa
1
160
プロダクトエンジニアに必要な「いい感じ」に作る能力 〜たくさん作れる時代に、どこまで作るかの決め方〜
jnishime_dresscode
2
1.4k
TinyGo 開発サイクルを高速化する:Go で作るエミュレータ入門
zozotech
PRO
1
120
少人数データチームのDevin活用実践事例
runandy16
2
450
Bet AI Day 2026丨How We Bet AI: AIとともに働く場をつくる
layerx
PRO
2
2.8k
Backstageでつくるセルフサービスな社内開発基盤
kikunosuke75
1
360
AIで開発は速くなったのに、なぜ現場は楽にならないのか 〜あなたの組織のボトルネックを突き止めるワークショップ〜
jacopen
1
270
Featured
See All Featured
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
770
Facilitating Awesome Meetings
lara
57
7.1k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
490
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
290
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2.1k
Building Applications with DynamoDB
mza
96
7.2k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
230
Speed Design
sergeychernyshev
33
2.1k
SEO for Brand Visibility & Recognition
aleyda
0
4.7k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.2k
Transcript
Flutter × GraphQLでアプリを作ってみる Press Space for next page
自己紹介 📝 飯野陽平(wheatandcat) 🏢 会社: 合同会社UNICORN 代表社員 📚 Blog: https://www.wheatandcat.me/
🛠 今までに作ったもの memoir OOMAKA MarkyLinky
Flutterとは? Google開発のオープンソースのマルチプラットフォームの開発フレームワーク 一つのコードベースから、iOS、Android、Web、Windows、Mac、Linuxアプリなど複数のプラットフォ ームの作成が可能 言語はDartを使用 Google独自のUI Widgetを使用(Material Designベース) なので、プラットフォーム毎でUIに差分が発生しづらい
今回の開発物 まだ開発中だが、家の在庫を管理するアプリを作成中 上記の画像のような画面構成にする予定
現在の開発構成 Frontend Flutter Backend NestJS Prisma PlanetScale GraphQL Code Generator
Cloud Run
開発構成のモチベーション 普段はReact Nativeでアプリ開発をしているので、よく比較対象に挙がる Flutter で本格的な開発をしてみ たかった NestJSの採用の一番大きい理由は、Prismaを使って開発をしたかったから 前に試したT3 Stackでの開発体験が良かったので、他の構成でも使ってみたかった tRPCが、もっとも望ましかったが、Flutterではサポートされていないので、GraphQLを採用
NestJSはBFFの構成にした場合に、採用されるけーすが多いので、触ってみたかった Flutterでもgraphql_codegenで型安全で実装はできるので、それを使って開発 各比較についてはスライドの最後に記載
Flutterの開発 基本的なコードの書き方は以下のような感じ import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class
MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('Hello Flutter'), ), body: Center( child: Text('Welcome to Flutter'), ), ), ); } }
Flutterの開発 基本的なコードの書き方は以下のような感じ void main() { runApp(MyApp()); } import 'package:flutter/material.dart'; class
MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('Hello Flutter'), ), body: Center( child: Text('Welcome to Flutter'), ), ), ); } }
Flutterの開発 基本的なコードの書き方は以下のような感じ class MyApp extends StatelessWidget { const MyApp({super.key}); @override
Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('Hello Flutter'), ), body: Center( child: Text('Welcome to Flutter'), ), ), ); } } import 'package:flutter/material.dart'; void main() { runApp(MyApp()); }
Flutterの開発 基本的なコードの書き方は以下のような感じ appBar: AppBar( title: Text('Hello Flutter'), ), import 'package:flutter/material.dart';
void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( body: Center( child: Text('Welcome to Flutter'), ), ), ); } }
Flutterの開発 基本的なコードの書き方は以下のような感じ body: Center( child: Text('Welcome to Flutter'), ), import
'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('Hello Flutter'), ), ), ); } }
Flutterの開発 基本的なコードの書き方は以下のような感じ import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class
MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('Hello Flutter'), ), body: Center( child: Text('Welcome to Flutter'), ), ), ); } }
Widgetとは? 先程のコードで説明した通り、FlutterではWidgetを使用してUIを構築していく FlutterではWidgetを公式から提供されており、それらを組み合わせて画面を作成していく 提供されているWidgetの一覧は以下のページから確認可能 Widget catalog | Flutter
FlutterとGraphQLの連携① Flutterでもgraphql_codegenを導入すれば型安全でGraphQLのクエリを実行できるので手順を紹介 まずは、backendからGraphQLのスキーマファイルを取得 type Query { categories: [Category] category(id: Int!):
Category } type Category { " カテゴリーID" id: ID! " カテゴリー名" name: String! " 順番" order: Int! }
FlutterとGraphQLの連携② 次にFlutterからアクセスするためのクエリを作成 query Category($id: Int!) { category(id: $id) { id
name order } }
FlutterとGraphQLの連携③ graphql_codegenの初期設定をして以下のコマンドを実行 以下のファイルが生成される lib/graphql/category.gql.dart dart run build_runner build
FlutterとGraphQLの連携④ ③で生成したファイルを参照して、以下のようにクエリを実行して値を取得 class Items extends HookWidget { final int id;
const Items({super.key, required this.id}); @override Widget build(BuildContext context) { final queryResult = useQuery$Category( Options$Query$Category(variables: Variables$Query$Category(id: id))); final result = queryResult.result; if (result.isLoading) { return const Text('Loading...'); } final Query$Category$category category = Query$Category$category.fromJson( result.data!['category'] as Map<String, dynamic>); return Text(category.name); } }
FlutterとGraphQLの連携④ ③で生成したファイルを参照して、以下のようにクエリを実行して値を取得 final queryResult = useQuery$Category( Options$Query$Category(variables: Variables$Query$Category(id: id))); class
Items extends HookWidget { final int id; const Items({super.key, required this.id}); @override Widget build(BuildContext context) { final result = queryResult.result; if (result.isLoading) { return const Text('Loading...'); } final Query$Category$category category = Query$Category$category.fromJson( result.data!['category'] as Map<String, dynamic>); return Text(category.name); } }
FlutterとGraphQLの連携④ ③で生成したファイルを参照して、以下のようにクエリを実行して値を取得 if (result.isLoading) { return const Text('Loading...'); } class
Items extends HookWidget { final int id; const Items({super.key, required this.id}); @override Widget build(BuildContext context) { final queryResult = useQuery$Category( Options$Query$Category(variables: Variables$Query$Category(id: id))); final result = queryResult.result; final Query$Category$category category = Query$Category$category.fromJson( result.data!['category'] as Map<String, dynamic>); return Text(category.name); } }
FlutterとGraphQLの連携④ ③で生成したファイルを参照して、以下のようにクエリを実行して値を取得 final Query$Category$category category = Query$Category$category.fromJson( result.data!['category'] as Map<String,
dynamic>); return Text(category.name); class Items extends HookWidget { final int id; const Items({super.key, required this.id}); @override Widget build(BuildContext context) { final queryResult = useQuery$Category( Options$Query$Category(variables: Variables$Query$Category(id: id))); final result = queryResult.result; if (result.isLoading) { return const Text('Loading...'); } } }
FlutterとGraphQLの連携④ ③で生成したファイルを参照して、以下のようにクエリを実行して値を取得 class Items extends HookWidget { final int id;
const Items({super.key, required this.id}); @override Widget build(BuildContext context) { final queryResult = useQuery$Category( Options$Query$Category(variables: Variables$Query$Category(id: id))); final result = queryResult.result; if (result.isLoading) { return const Text('Loading...'); } final Query$Category$category category = Query$Category$category.fromJson( result.data!['category'] as Map<String, dynamic>); return Text(category.name); } }
今回作成したリポジトリの紹介 Repository wheatandcat/stock-keeper wheatandcat/stock-keeper-backend
React Nativeとの比較 まだ、Flutterの方はざっくりな開発しかしていないが、現状の所感での比較を記載 パフォーマンスチューニングのやりやすさ Flutter >> React Native 運用/保守コスト Flutter
>> React Native UI/システムの柔軟性 React Native > Flutter 開発のとっつきやすさ Expo >>> Flutter > React Native エコシステムの充実度/熟練度 React Native >>> Flutter backendとの連携 React Native > Flutter
まとめ よくFlutterとReact Nativeの比較がされる記事を見かけていたが、Flutterは触ってなかったので、あまりピンと来てなかっ たが、今回の開発でその辺が把握できた dartは簡単なので、たぶんReact経験者なら、すぐに慣れると思う Flutterの魅力はGoogle独自のWidgetを使用することで、プラットフォーム毎でUIに差分が発生しづらく保守コストが少なく 済むところ React Nativeはパフォーマンスチューニングのコーディング難易度が非常に高いので、その辺はFlutterの方が強そう エコシステムの充実度はnpmの圧倒的な数
& 完成度の高いパッケージが多いので、この辺はReact Nativeの方に軍配が上が る GraphQLの連携周りも React Nativeの方がサポートが充実している 初期開発の充実度はExpoが最も優れており、アプリリリースまではコストは一番低そう 今後増えてくるtRPCのサポートに関してはFultterだと言語の壁があり、もしサポートされてもファースト扱いにはならない ので、この辺はReact Nativeの方が有利そう 思った以上に良い勝負をしているので、今後の動向が楽しみ
ご清聴ありがとうございました 🎉