取り組みの背景 — なぜメモアプリを作るのか?
スマートフォンアプリの中でもっとも身近な存在のひとつが、メモ・ノートアプリです。Apple の「メモ」や Google Keep のように、思いついたアイデアやタスクをさっと記録できるアプリは、日常的に多くの人が使っています。
このチュートリアルでは、Rorkを使ってメモアプリをゼロから構築する方法を解説します。Rork の AI によるコード生成機能を活用することで、プログラミング初心者でも本格的なノートアプリを短時間で作ることができます。
この記事で学べること:
- Rork でメモアプリの画面構成を設計する方法
- AsyncStorage を使ったデータの永続化(保存・読み込み)
- リアルタイム検索機能の実装
- カテゴリ分類とフィルタリングの追加
- アプリの見た目をプロ品質に仕上げるコツ
対象読者: Rork をこれから使い始める方、または簡単なアプリを作りながら学びたい方
前提知識と環境準備
必要なもの
メモアプリを作り始める前に、以下を準備しましょう。
- Rork アカウント: rork.com で無料登録(Free プランでも週5回までプロジェクト生成可能)
- ブラウザ: Chrome または Safari の最新版
- スマートフォン: 実機でのプレビュー確認用(iOS / Android どちらでも可)
Rork の基本操作
Rork を初めて使う方は、まずRork入門ガイドで基本操作を確認してください。プロジェクト作成からプレビューまでの流れがわかります。
ステップ1 — プロジェクトの作成とプロンプト設計
Rork でアプリを作る際、もっとも重要なのは最初のプロンプトです。AI に的確な指示を出すことで、完成度の高いアプリが一発で生成されます。
おすすめのプロンプト例
Rork のプロジェクト作成画面で、以下のようなプロンプトを入力します。
メモ・ノートアプリを作ってください。
【画面構成】
1. メモ一覧画面(ホーム): メモのタイトルと作成日時を一覧表示
2. メモ作成・編集画面: タイトルと本文を入力できるフォーム
3. 検索画面: キーワードでメモを検索
【機能要件】
- メモの作成、編集、削除(スワイプ削除対応)
- AsyncStorage によるローカル保存
- タイトル・本文のリアルタイム検索
- カテゴリタグの追加(仕事、プライベート、アイデア、買い物)
- カテゴリでのフィルタリング
- 作成日時の自動記録と並び替え
【デザイン】
- ミニマルで洗練されたUI
- ライト / ダークモード対応
- カテゴリごとに色分け表示このプロンプトのポイントは、画面構成・機能要件・デザインの3つを明確に分けて指示していることです。Rork の AI はこの構造化された情報をもとに、適切なコンポーネントとナビゲーションを自動生成します。
ステップ2 — データモデルとストレージの設計
Rork が生成するコードの中核となるのがデータモデルです。メモアプリでは、以下のような型定義が生成されます。
// types/Note.ts — メモのデータ型定義
export interface Note {
id: string; // ユニークID(UUID)
title: string; // メモのタイトル
content: string; // メモの本文
category: Category; // カテゴリ
createdAt: string; // 作成日時(ISO 8601形式)
updatedAt: string; // 更新日時
}
// カテゴリの定義
export type Category = 'work' | 'personal' | 'idea' | 'shopping';
// カテゴリの表示名と色
export const CATEGORIES: Record<Category, { label: string; color: string }> = {
work: { label: '仕事', color: '#4A90D9' },
personal: { label: 'プライベート', color: '#7ED321' },
idea: { label: 'アイデア', color: '#F5A623' },
shopping: { label: '買い物', color: '#D0021B' },
};AsyncStorage によるデータ永続化
React Native の AsyncStorage を使うことで、アプリを閉じてもメモが消えません。Rork が生成するストレージユーティリティは次のような構造になります。
// utils/storage.ts — メモの保存・読み込み・削除
import AsyncStorage from '@react-native-async-storage/async-storage';
import { Note } from '../types/Note';
const STORAGE_KEY = '@notes_app_data';
// 全メモを取得
export const loadNotes = async (): Promise<Note[]> => {
try {
const json = await AsyncStorage.getItem(STORAGE_KEY);
return json ? JSON.parse(json) : [];
} catch (error) {
console.error('Failed to load notes:', error);
return [];
}
};
// メモを保存(全件上書き)
export const saveNotes = async (notes: Note[]): Promise<void> => {
try {
await AsyncStorage.setItem(STORAGE_KEY, JSON.stringify(notes));
} catch (error) {
console.error('Failed to save notes:', error);
}
};
// 期待する動作:
// - loadNotes() → 保存済みのメモ配列を返す(初回は空配列)
// - saveNotes([...]) → メモ配列を端末に永続保存AsyncStorage はキーバリュー型のストレージで、JSON 文字列として保存します。大量のデータ(数万件以上)を扱う場合は SQLite への移行を検討しますが、個人用メモアプリであれば AsyncStorage で十分です。
データの永続化についてさらに詳しく知りたい方は、AsyncStorageとNetInfoでオフライン対応アプリを作るも参考にしてください。
ステップ3 — メモ一覧画面の実装
メモ一覧画面はアプリの顔です。ユーザーが最初に目にする画面なので、見やすさと操作性が重要になります。
// screens/NoteListScreen.tsx — メモ一覧のコア部分
import React, { useState, useEffect, useCallback } from 'react';
import { FlatList, View, Text, TouchableOpacity, Alert } from 'react-native';
import { loadNotes, saveNotes } from '../utils/storage';
import { Note, CATEGORIES } from '../types/Note';
export default function NoteListScreen({ navigation }) {
const [notes, setNotes] = useState<Note[]>([]);
const [selectedCategory, setSelectedCategory] = useState<string | null>(null);
// アプリ起動時にメモを読み込み
useEffect(() => {
const unsubscribe = navigation.addListener('focus', async () => {
const saved = await loadNotes();
// 更新日時の新しい順に並べる
setNotes(saved.sort((a, b) =>
new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime()
));
});
return unsubscribe;
}, [navigation]);
// メモの削除
const deleteNote = useCallback(async (id: string) => {
Alert.alert('削除確認', 'このメモを削除しますか?', [
{ text: 'キャンセル', style: 'cancel' },
{
text: '削除',
style: 'destructive',
onPress: async () => {
const updated = notes.filter(n => n.id !== id);
setNotes(updated);
await saveNotes(updated);
},
},
]);
}, [notes]);
// カテゴリフィルター適用
const filteredNotes = selectedCategory
? notes.filter(n => n.category === selectedCategory)
: notes;
return (
<View style={{ flex: 1, padding: 16 }}>
{/* カテゴリフィルターボタン */}
<CategoryFilter
selected={selectedCategory}
onSelect={setSelectedCategory}
/>
{/* メモ一覧 */}
<FlatList
data={filteredNotes}
keyExtractor={(item) => item.id}
renderItem={({ item }) => (
<NoteCard
note={item}
onPress={() => navigation.navigate('Edit', { noteId: item.id })}
onDelete={() => deleteNote(item.id)}
/>
)}
ListEmptyComponent={
<Text style={{ textAlign: 'center', marginTop: 40, color: '#999' }}>
メモがありません。右下の + ボタンで作成しましょう!
</Text>
}
/>
</View>
);
}ポイント:FlatList の活用
React Native の FlatList は、大量のリストデータを効率的にレンダリングするコンポーネントです。メモが数百件に増えても、画面に表示されている分だけレンダリングするため、パフォーマンスが落ちません。
ステップ4 — リアルタイム検索機能の追加
メモが増えてくると、検索機能が欠かせません。Rork で生成されるアプリに、キーワード検索を追加する方法を見てみましょう。
// hooks/useNoteSearch.ts — メモ検索カスタムフック
import { useMemo } from 'react';
import { Note } from '../types/Note';
export function useNoteSearch(notes: Note[], query: string): Note[] {
return useMemo(() => {
if (!query.trim()) return notes;
const lowerQuery = query.toLowerCase();
return notes.filter(note =>
note.title.toLowerCase().includes(lowerQuery) ||
note.content.toLowerCase().includes(lowerQuery)
);
}, [notes, query]);
// 期待する動作:
// useNoteSearch(allNotes, '') → 全メモを返す
// useNoteSearch(allNotes, '会議') → タイトルまたは本文に「会議」を含むメモのみ返す
}useMemo を使うことで、メモ一覧や検索クエリが変わったときだけフィルタリング処理が実行されます。キーボード入力のたびに全件スキャンが走らないよう最適化されています。
プロンプトで検索機能を追加するコツ
最初のプロンプトに検索機能を含めなかった場合でも、Rork のチャットで以下のように追加指示を出せます。
メモ一覧画面の上部に検索バーを追加してください。
タイトルと本文の両方を対象にリアルタイム検索できるようにしてください。
検索中はキーボードの上に「○件見つかりました」と表示してください。ステップ5 — デザインを磨く実践テクニック
メモアプリの見た目をプロ品質に仕上げるポイントをいくつか紹介します。
カテゴリの色分けバッジ
各メモカードにカテゴリバッジを表示すると、一覧画面の視認性が大幅に向上します。
// components/CategoryBadge.tsx — カテゴリバッジコンポーネント
import React from 'react';
import { View, Text } from 'react-native';
import { Category, CATEGORIES } from '../types/Note';
export function CategoryBadge({ category }: { category: Category }) {
const { label, color } = CATEGORIES[category];
return (
<View style={{
backgroundColor: color + '20', // 透明度20%の背景
paddingHorizontal: 8,
paddingVertical: 3,
borderRadius: 12,
alignSelf: 'flex-start',
}}>
<Text style={{ color, fontSize: 12, fontWeight: '600' }}>
{label}
</Text>
</View>
);
}ダークモード対応
Rork に「ダークモード対応」を指示すると、useColorScheme フックを使った自動切替が実装されます。追加でカスタマイズしたい場合は、チャットで「ダークモード時の背景色を #1A1A2E にして」のように具体的な色指定をすると反映されます。
まとめ — メモアプリから始めるアプリ開発
メモアプリは構造がシンプルでありながら、データ永続化、検索、フィルタリングといったアプリ開発の基本的なパターンを一通り学べる優れた教材です。
このチュートリアルで実装した主な機能をまとめると、以下の通りです。
- データモデル設計 — TypeScript で型安全なデータ構造を定義
- AsyncStorage によるデータ永続化 — アプリを閉じてもデータが残る仕組み
- FlatList による効率的なリスト表示 — 大量データでもスムーズな描画
- リアルタイム検索 — useMemo を使った最適化済みの検索ロジック
- カテゴリ分類とフィルタリング — メモを整理しやすいUI
このメモアプリをベースに、Markdown対応やリマインダー機能、クラウド同期などを追加していけば、App Store で公開できるレベルのアプリに仕上がります。まずは Rork でプロジェクトを作成して、自分だけのメモアプリを完成させてみてください。
次のステップとして、はじめてのRorkアプリを30分で作るで Rork の操作に慣れたり、ToDoアプリの作り方でタスク管理機能を学ぶのもおすすめです。