Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Flutterを使って医師相談アプリを短期リリースした話

 Flutterを使って医師相談アプリを短期リリースした話

コロナ時代の医療業界を支援するエムスリーのプロダクト開発の舞台裏 にて発表
https://m3-engineer.connpass.com/event/180876/

AskDoctorsのアプリをFlutterで開発したときの話です

Takaki Hoshikawa

July 09, 2020
Tweet

More Decks by Takaki Hoshikawa

Other Decks in Programming

Transcript

  1.   メンバー構成 • アプリエンジニア(私)、サーバサイドエンジ ニアはAskDoctorsチーム外のメンバーとい う強気の構成 • プロジェクトは1月スタートなのにデザイナー は4月入社というさらに強気の構成 役割

    人数 プロダクトマネージャー (メイン・アシスタント ) 2 スクラムマスター 1 アプリエンジニア 1 サーバサイドエンジニア 1 QAエンジニア 1 デザイナー 1
  2.   2019年12月 AskDoctorsアプリ 構想が持ち上がる プロジェクト 始動 2020年1月 プロジェクト状況 社会的な状況 1/16

    国内最初の COVID-19感染確認 ペーパープロトタ イプv1完成 プロジェクト承認 2月 3月 ユーザーインタ ビュー開始 2/13 東京都在住者初の COVID-19感染確認
  3.   3月 アプリ 実装開始 4月 プロジェクト状況 社会的な状況 3/20 国内累計感染者 数

    1,000人を超える アプリv1.0.0 完成 5月 6月 ユーザーイン タビュー開始 4/7 7都府県に 緊急事態宣言 5/25 東京都など 緊急事態宣言解除 デザイナー入社 4/18 国内累計感染者 数 10,000人を超える 6/18 自粛要請解除 Flutter未経験ながら 約2ヶ月で両OS実装
  4.   • Flutter • Firebase ◦ Push通知やAnalyticsで利用 • OpenAPI ◦

    APIの提供先がこのアプリのみなのでGraphQLなどは用いず ◦ Dart向けにAPIクライアントの自動生成をしやすいのも強み
  5.   Future<void> createFile(String fileName) async { try { var file

    = File('$fileName.txt'); if (await file.exists()) { var modified = await file.lastModified(); print('$fileName は既に存在します。 $modified に変更されました。'); return; } await file.create(); } on IOException catch (e) { print('$fileName を作成できません: $e'); } } より、一部改変
  6.   Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title:

    const Text('$_pageTitle'), ), // AppBar body: Center(child: Text('$_count 回')), floatingActionButton: FloatingActionButton( onPressed: () => setState(() => _count++), tooltip: 'カウンタ', child: const Icon(Icons.add), ), // FloatingActionButton ); // Scaffold } より、一部改変
  7.   Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title:

    const Text('$_pageTitle'), ), // AppBar body: Center(child: Text('$_count 回')), floatingActionButton: FloatingActionButton( onPressed: () => setState(() => _count++), tooltip: 'カウンタ', child: const Icon(Icons.add), ), // FloatingActionButton ); // Scaffold } より、一部改変
  8.   Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title:

    const Text('$_pageTitle'), ), // AppBar body: Center(child: Text('$_count 回')), floatingActionButton: FloatingActionButton( onPressed: () => setState(() => _count++), tooltip: 'カウンタ', child: const Icon(Icons.add), ), // FloatingActionButton ); // Scaffold } より、一部改変
  9.   Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title:

    const Text('$_pageTitle'), ), // AppBar body: Center(child: Text('$_count 回')), floatingActionButton: FloatingActionButton( onPressed: () => setState(() => _count++), tooltip: 'カウンタ', child: const Icon(Icons.add), ), // FloatingActionButton ); // Scaffold } より、一部改変