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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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に丸投げしないトイル削減 / Eliminating Toil Without Leaving It All to AI
kohbis
3
990
なぜSRE・セキュリティは評価されないのか?守りの組織を事業成長エンジンに変えた実践
cscengineer
PRO
3
2.3k
Jetpack Compose で挑む新聞紙面UI ─ 複合ジェスチャー・ポリゴン記事領域・適応的ページ構成という3つの壁/droidkaigi2026
nikkei_engineer_recruiting
0
240
Beyond the Hype: Practical AI for Your Oracle Database with MCP
thatjeffsmith
1
280
2026/09/10 Spring_Bootから_Jakarta_EE_MicroProfileへの移行
megascus
0
220
【Oracle AI Spotlight ウェビナー】AWSか、Azureか、Google Cloudか。その議論にオラクルを含める意義。
oracle4engineer
PRO
2
240
AndroidでHDRメディアを「壊さずに」扱う
chigichan24
0
420
PM領域でのAI Agentの活用
lycorptech_jp
PRO
0
280
enechainの内製セルフサービスプラットフォーム
hiyosi
0
130
リージョンの壁を越える、 ちょっと変わったAWSサービスの話
falken
PRO
0
270
DGX Sparkを2台使って いろいろ動かす話
sonoda_mj
1
140
2026-09-11 【Snowflake World Tour Tokyo 2026】Snowflakeを起点に、AI Agentが自律稼働し続ける未来へ / Driving AI Agents with Snowflake
civitaspo
0
170
Featured
See All Featured
Paper Plane (Part 1)
katiecoart
PRO
1
11k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
690
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
430
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.8k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
74
42k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
270
Skip the Path - Find Your Career Trail
mkilby
1
220
Building Applications with DynamoDB
mza
96
7.2k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
570
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
260
Un-Boring Meetings
codingconduct
0
410
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の方が有利そう 思った以上に良い勝負をしているので、今後の動向が楽しみ
ご清聴ありがとうございました 🎉