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
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
120
ユニバーサルリンク/アプリリンクを使ってQRコードでゲストログインできるようにする
wheatandcat
0
390
Firebase App Checkを実装したので紹介
wheatandcat
0
330
PlanetScaleの無料プランがなくなるので、NeonとTiDBを試してみた
wheatandcat
0
430
Flutter HooksとRiverpodの解説
wheatandcat
0
590
T3 Stack(応用編: Next Auth & SSRの実装紹介)
wheatandcat
1
410
App Routerの紹介
wheatandcat
0
160
Other Decks in Technology
See All in Technology
AI-DLC実践録_フルサイクル開発への挑戦
miyuc
0
310
トークンマネジメントでAIにとって働きやすい環境を実現する
hikaruegashira
0
120
Digitization部 紹介資料
sansan33
PRO
2
7.7k
平文パスワードはログに“残り” ── 肝心の侵入は“痕跡すら残らない”
kuroneko13
0
110
属人化を叩き割れ!「制作加速」と「安定化」の矛盾を打破する:8年目プロダクトが辿り着いた「ミスが起こり得ない」アセット制作フローの全貌
gree_tech
PRO
0
120
SmartHR Engineering Team Deck
smarthr
1
3.1k
MIXIで活躍できるエンジニアを 若手社員目線で考えてみる
mixi_engineers
PRO
0
110
現場回帰したデータエンジニアが考える AI 時代のキャリア開発 / Career Development in the Age of AI Perspectives from a Hands-on Data Engineer
medley
0
280
AI・HPC開発を支えるGPU環境の新しい選択肢 液冷GPUシステム「AquSys」の取り組み
gpuunite_official
0
150
Master Dataグループ紹介資料
sansan33
PRO
1
4.8k
形式手法特論:Hyperproperty とモデル検査 #kernelvm / Kernel VM Study Tokyo 19th
ytaka23
0
290
SO-101×VLAによる3色キューブのピック&プレース
abeja
0
220
Featured
See All Featured
The Language of Interfaces
destraynor
162
27k
Thoughts on Productivity
jonyablonski
76
5.3k
Test your architecture with Archunit
thirion
2
2.3k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.8k
Claude Code のすすめ
schroneko
67
230k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
Paper Plane
katiecoart
PRO
2
53k
Technical Leadership for Architectural Decision Making
baasie
3
510
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の方が有利そう 思った以上に良い勝負をしているので、今後の動向が楽しみ
ご清聴ありがとうございました 🎉