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
110
作成中のFlutterアプリの中間発表
wheatandcat
0
93
最近読んだ技術書を簡単紹介
wheatandcat
0
110
ユニバーサルリンク/アプリリンクを使ってQRコードでゲストログインできるようにする
wheatandcat
0
390
Firebase App Checkを実装したので紹介
wheatandcat
0
320
PlanetScaleの無料プランがなくなるので、NeonとTiDBを試してみた
wheatandcat
0
420
Flutter HooksとRiverpodの解説
wheatandcat
0
580
T3 Stack(応用編: Next Auth & SSRの実装紹介)
wheatandcat
1
410
App Routerの紹介
wheatandcat
0
150
Other Decks in Technology
See All in Technology
OPENLOGI Company Profile for engineer
hr01
1
74k
AI時代におけるエンジニアの新たな役割──FDEとクオリアの探求/登壇資料(戸井田 裕貴)
hacobu
PRO
0
300
Devsumi 2026 Summer 人もAIも使える共通基盤を事業の加速装置にする~デザインシステム運用に学ぶ組織レバレッジ~ 渡辺 凌央
legalontechnologies
PRO
1
280
ここは地獄!つらい朝会を体験することで、チームとしてのより良い振る舞いに気づくワークショップ / The stand-up meeting from hell in the game industry
scrummasudar
0
210
AmplifyHostingConstructからSSRフレームワークのためのホスティング設計を考察する/amplify-hosting-construct
fossamagna
1
290
Data + AI Summit 2026 イベントレポート: 「AIがビジネスで意思決定するデータ基盤」へ
nek0128
0
300
凡エンジニアがこの先生きのこるためには。〜TypeScript完全に理解したい〜
alchemy1115
2
410
GoでCコンパイラを作った話
repunit
0
150
AI時代の開発生産性は、個人技からチーム設計へ
moongift
PRO
4
2.5k
そのドキュメント、自動化しませんか?
yuksew
1
400
アップデートで何が変わった?デモで学んで使いこなすIBM Bob2.0
muehara
0
220
AI_Dev_Day_製造業領域でのAI活用から見た活用の罠と成功に導く実践知.pdf
kintotechdev
0
150
Featured
See All Featured
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
120k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
Crafting Experiences
bethany
1
230
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.9k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
55k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Un-Boring Meetings
codingconduct
0
350
Raft: Consensus for Rubyists
vanstee
141
7.6k
Scaling GitHub
holman
464
140k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
440
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の方が有利そう 思った以上に良い勝負をしているので、今後の動向が楽しみ
ご清聴ありがとうございました 🎉