取り組みの背景
毎日の水分補給は健康維持に欠かせませんが、実際にどれくらい水を飲んだか記録している方は少ないのではないでしょうか。Rork を使って水分摂取トラッカーアプリを一から作る方法を順を追って整理していきます。
このチュートリアルで作るアプリは、水分摂取量の記録、1日の目標に対する進捗のビジュアル表示、そして飲み忘れを防ぐリマインダー通知という3つの主要機能を備えています。Rork を初めて触る方でも、プロンプトの書き方からUI設計の考え方まで順を追って説明しますので、安心して取り組んでいただけます。
対象読者
- Rork でアプリ開発を始めたい初心者の方
- ヘルスケア系アプリの構造を学びたい方
- React Native のデータ永続化や通知の仕組みに興味がある方
完成イメージ
完成するアプリには、次の画面と機能が含まれます。
- ホーム画面: 今日の水分摂取量と目標値の円形プログレスバー、ワンタップで記録するボタン
- 履歴画面: 過去7日間の摂取量を棒グラフで表示
- 設定画面: 1日の目標量とリマインダー間隔の調整
前提知識・環境準備
Rork のアカウントがあればブラウザだけで開発を始められます。プログラミング経験がなくても大丈夫ですが、以下の概念を知っていると理解がスムーズです。
- コンポーネント: 画面を構成する部品(ボタン、テキスト、カードなど)
- ステート(状態): アプリが保持するデータ(今日飲んだ水の量など)
- AsyncStorage: デバイス内にデータを保存する仕組み
Rork は無料プランでも週5回までプロジェクトを生成できるので、まずは気軽に試してみてください。
ステップ 1: プロジェクト作成と基本UI
Rork でプロジェクトを作成する際に、最初のプロンプトがアプリの骨格を決めます。以下のようなプロンプトを入力しましょう。
水分摂取トラッカーアプリを作ってください。
画面構成:
1. ホーム画面 — 今日の水分摂取量を円形プログレスバーで表示。
150ml / 250ml / 500ml のクイック追加ボタン。
2. 履歴画面 — 過去7日間の摂取量を棒グラフで表示。
3. 設定画面 — 1日の目標量(ml)を設定。
デザイン:
- 水色を基調としたクリーンなUI
- ボトムタブナビゲーション(ホーム / 履歴 / 設定)
データ:
- AsyncStorage でローカル保存このプロンプトを送ると、Rork が自動的にReact Native + Expo のプロジェクトを生成します。生成されたコードの中で特に注目すべきポイントは、タブナビゲーションの構造とコンポーネントの分離です。
生成されるファイル構造の例
app/
├── (tabs)/
│ ├── index.tsx # ホーム画面
│ ├── history.tsx # 履歴画面
│ └── settings.tsx # 設定画面
├── _layout.tsx # ナビゲーション設定
components/
├── CircularProgress.tsx # 円形プログレスバー
├── QuickAddButton.tsx # クイック追加ボタン
└── WeeklyChart.tsx # 週間棒グラフ
stores/
└── waterStore.ts # 状態管理(Zustand等)
ステップ 2: データの永続化
水分摂取の記録は、アプリを閉じても消えないようにデバイスに保存する必要があります。Rork が生成するコードでは通常 AsyncStorage が使われますが、データ構造の設計が重要です。
以下のプロンプトで、データモデルを明確に指定しましょう。
データモデルを以下のように設計してください:
- WaterLog: { id: string, amount: number, timestamp: string }
- DailyRecord: { date: string, logs: WaterLog[], totalAmount: number }
- Settings: { dailyGoal: number, reminderInterval: number }
AsyncStorage に保存するキー:
- @water_logs — 日付ごとの記録(直近30日分)
- @settings — ユーザー設定
アプリ起動時に AsyncStorage からデータを読み込んでステートに反映してください。AsyncStorage は文字列しか保存できないため、JSON.stringify で変換してから保存し、読み込み時に JSON.parse で復元する処理が自動生成されます。
// stores/waterStore.ts の主要部分(期待される生成コード)
import AsyncStorage from '@react-native-async-storage/async-storage';
const STORAGE_KEY = '@water_logs';
// データ保存
const saveLogs = async (logs: Record<string, DailyRecord>) => {
await AsyncStorage.setItem(STORAGE_KEY, JSON.stringify(logs));
};
// データ読み込み
const loadLogs = async (): Promise<Record<string, DailyRecord>> => {
const data = await AsyncStorage.getItem(STORAGE_KEY);
return data ? JSON.parse(data) : {};
};データのローカル保存について、さらに実践的なパターンを知りたい方は Rork アプリのオフライン対応 — AsyncStorage と NetInfo の実装ガイド も参考になります。
ステップ 3: 円形プログレスバーの実装
ホーム画面の中心となる円形プログレスバーは、ユーザーが一目で目標への進捗を把握できる重要なUIです。Rork に以下のプロンプトで指示します。
ホーム画面の円形プログレスバーを改善してください:
- SVG で描画(react-native-svg 使用)
- 目標達成率に応じて色が変化(0-50%: 水色, 50-80%: 青, 80-100%: 濃い青, 100%: 緑)
- 中央に「750 / 2000 ml」のように現在値/目標値を表示
- 達成時にアニメーション付きのお祝い表示
- プログレスバーのアニメーション(値が増えるときスムーズに動く)Rork はこのプロンプトから、react-native-svg を使った円形プログレスコンポーネントを生成します。SVG の strokeDasharray と strokeDashoffset を使った描画手法は、パフォーマンスに優れたアプローチです。
// components/CircularProgress.tsx の期待される出力例
import Svg, { Circle } from 'react-native-svg';
import { Animated } from 'react-native';
interface CircularProgressProps {
current: number; // 現在の摂取量
goal: number; // 目標量
size?: number; // コンポーネントのサイズ
}
export default function CircularProgress({ current, goal, size = 200 }: CircularProgressProps) {
const radius = (size - 20) / 2;
const circumference = 2 * Math.PI * radius;
const progress = Math.min(current / goal, 1);
const strokeDashoffset = circumference * (1 - progress);
// 達成率に応じた色の決定
const getColor = () => {
if (progress >= 1) return '#22c55e'; // 緑(達成)
if (progress >= 0.8) return '#1e40af'; // 濃い青
if (progress >= 0.5) return '#3b82f6'; // 青
return '#7dd3fc'; // 水色
};
return (
<Svg width={size} height={size}>
{/* 背景の円 */}
<Circle cx={size/2} cy={size/2} r={radius}
stroke="#e5e7eb" strokeWidth={10} fill="none" />
{/* 進捗の円 */}
<Circle cx={size/2} cy={size/2} r={radius}
stroke={getColor()} strokeWidth={10} fill="none"
strokeDasharray={circumference}
strokeDashoffset={strokeDashoffset}
strokeLinecap="round"
rotation={-90} origin={`${size/2}, ${size/2}`} />
</Svg>
);
}ステップ 4: リマインダー通知の追加
定期的な水分補給リマインダーは、このアプリの核となる機能です。Expo の Notifications API を使って実装します。
リマインダー通知機能を追加してください:
- 設定画面で通知間隔を選択(30分 / 1時間 / 2時間 / 3時間)
- 起床時間〜就寝時間の間だけ通知(デフォルト: 8:00〜22:00)
- 通知メッセージ例:「水分補給の時間です 💧 今日の目標まであと 750ml」
- 目標達成済みの日は通知をスキップ
- expo-notifications を使用通知の設定はユーザー体験に直結します。通知が多すぎると煩わしく、少なすぎると効果がありません。デフォルトの1時間間隔は多くのユーザーにとってバランスの良い設定です。
// utils/notifications.ts の期待される出力例
import * as Notifications from 'expo-notifications';
export async function scheduleWaterReminder(intervalHours: number) {
// 既存の通知をキャンセル
await Notifications.cancelAllScheduledNotificationsAsync();
// 新しいリマインダーをスケジュール
await Notifications.scheduleNotificationAsync({
content: {
title: '水分補給の時間です 💧',
body: '健康のために、コップ1杯の水を飲みましょう',
sound: 'default',
},
trigger: {
type: Notifications.SchedulableTriggerInputTypes.TIME_INTERVAL,
seconds: intervalHours * 3600,
repeats: true,
},
});
}プッシュ通知の実装パターンについてより詳しく学びたい方は、Rork アプリにプッシュ通知を実装する方法 が体系的にまとまっています。
ステップ 5: 週間グラフの表示
履歴画面には過去7日間の摂取量を棒グラフで表示します。データの可視化はユーザーのモチベーション維持に大きく貢献します。
履歴画面を以下のように実装してください:
- 過去7日間の水分摂取量を棒グラフで表示
- react-native-chart-kit または victory-native を使用
- 各バーに摂取量(ml)のラベルを表示
- 目標ラインを点線で表示
- 目標達成日はバーの色を緑に変更
- 週間平均と達成率を画面上部に表示// screens/HistoryScreen.tsx の期待される出力例(抜粋)
import { BarChart } from 'react-native-chart-kit';
import { Dimensions } from 'react-native';
const screenWidth = Dimensions.get('window').width;
// 過去7日間のデータを整形
const chartData = {
labels: ['月', '火', '水', '木', '金', '土', '日'],
datasets: [{
data: weeklyData.map(d => d.totalAmount),
colors: weeklyData.map(d =>
// 目標達成日は緑、未達成は青
(opacity = 1) => d.totalAmount >= dailyGoal
? `rgba(34, 197, 94, ${opacity})`
: `rgba(59, 130, 246, ${opacity})`
),
}],
};
return (
<BarChart
data={chartData}
width={screenWidth - 32}
height={220}
yAxisSuffix="ml"
chartConfig={{
backgroundColor: '#ffffff',
backgroundGradientFrom: '#ffffff',
backgroundGradientTo: '#f0f9ff',
decimalPlaces: 0,
color: (opacity = 1) => `rgba(59, 130, 246, ${opacity})`,
}}
fromZero
showValuesOnTopOfBars
/>
);グラフ表示のカスタマイズについてさらに詳しく知りたい方は、Rork × Victory Native で作るインタラクティブなチャートダッシュボード がおすすめです。
ステップ 6: UX を磨く
基本機能が動いたら、ユーザー体験を向上させる仕上げを行います。以下のプロンプトで、触り心地の良いアプリに仕上げましょう。
以下のUX改善を行ってください:
1. クイック追加ボタンにハプティックフィードバックを追加(expo-haptics)
2. 水を追加した時にスプラッシュアニメーション(Lottie)
3. 目標達成時に紙吹雪エフェクト
4. ダークモード対応
5. カスタム水分量の入力モーダル(150/250/500ml以外の量を追加したい場合)ハプティックフィードバックは小さな工夫ですが、「記録した」という実感をユーザーに与える効果があります。特にヘルスケアアプリでは、こうした触覚的なレスポンスがアプリの継続利用率を高めることが知られています。
まとめ
このチュートリアルでは、Rork を使って水分摂取トラッカーアプリを作る全工程を解説しました。プロジェクト作成から始まり、データのローカル保存、円形プログレスバーによる進捗表示、定期リマインダー通知、週間グラフによる可視化、そしてUXの仕上げまで、一通りの実装を体験できたかと思います。
今回作ったアプリは、ヘルスケアカテゴリの入門として最適な構成です。ここから機能を拡張して、食事記録や運動ログとの連携、友達との目標共有機能など、より本格的なヘルスケアアプリへと発展させることもできます。
Rork なら自然言語のプロンプトだけでここまでのアプリを形にできるので、まずは気軽に手を動かしてみてください。作りながら学ぶことが、アプリ開発の上達への一番の近道です。