Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Flutter × GraphQLでアプリを作ってみる
Search
Yohei Iino
February 23, 2024
Technology
360
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
97
最近読んだ技術書を簡単紹介
wheatandcat
0
120
ユニバーサルリンク/アプリリンクを使ってQRコードでゲストログインできるようにする
wheatandcat
0
390
Firebase App Checkを実装したので紹介
wheatandcat
0
360
PlanetScaleの無料プランがなくなるので、NeonとTiDBを試してみた
wheatandcat
0
440
Flutter HooksとRiverpodの解説
wheatandcat
0
610
T3 Stack(応用編: Next Auth & SSRの実装紹介)
wheatandcat
1
420
App Routerの紹介
wheatandcat
0
170
Other Decks in Technology
See All in Technology
C#コードの結合を可視化する Roslyn解析による設計改善と リファクタリング判断
dora56
0
740
spanner-autoscalerに学ぶ CRD設計パターン 〜自動化と緊急時対応を両立する Kubernetesコントローラーの作り方〜
tkuchiki
0
140
品質と信頼性を地続きにする
grimoh
2
1k
2026-09-08 そのJavaモダナイゼーション、AIに丸投げで大丈夫?IBM Bobで変わる品質と効率
yutanonaka
1
200
Datadog で始める トークンセーフティなAI 導⼊と定着
vkbaba
1
100
CI/CDではもう遅い - 人とAIが迂回しないDevSecOps Verify基盤の再設計 -
kintotechdev
1
270
AgentCore Runtime上にAgentic Coding基盤を構築・展開する際の設計ポイントと限界点 / Design considerations and limitations when building an agentic coding platform on AgentCore Runtime
har1101
6
770
PQC移行の今 -- IETF からみた現在地
satokan
3
350
白金鉱業Meetup Vol.25 アウトカムが二値のデータに対するCausal Impact
brainpadpr
0
310
AIエージェントを安全で速い現場監督にする:Jev・Obsidian・メタハーネス
x5gtrn
PRO
0
120
2026-09-18 gotanda.sre Terraformで複数環境作ったり、複数Stateに分割したりそれとTerragrunt / Terraform multi envs and multi states
masasuzu
4
740
今話題のAI「Jev」って何? 宇宙最速で学ぶ会
minorun365
PRO
34
22k
Featured
See All Featured
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
290
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.7k
Navigating Weather and Climate Data
rabernat
0
530
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
430
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
370
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
670
Building the Perfect Custom Keyboard
takai
2
890
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
2
2.2k
Accessibility Awareness
sabderemane
1
220
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
900
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
540
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の方が有利そう 思った以上に良い勝負をしているので、今後の動向が楽しみ
ご清聴ありがとうございました 🎉