mobile について
mobileは、クロスプラットフォームのモバイルアプリ開発者向けスキルです。React NativeとFlutterのコンポーネント、ナビゲーション、性能改善、ネイティブモジュール、アプリストアへの公開例を扱います。
主な機能
- 01React Nativeの開発パターン
- 02Flutterの開発パターン
- 03ナビゲーションと状態管理の解説
- 04モバイル性能改善の指針
- 05ネイティブモジュールとアプリ公開への対応
活用シーン
- 01モバイルアプリのリスト画面を構築
- 02ナビゲーションと状態管理を実装
- 03モバイルアプリの性能問題を調査
- 04オフラインデータ対応を追加
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ htlin222/ dotfiles --skill mobileインストール後、Claude Code で/mobileを入力して読み込まれたか確認します。
詳細
モバイル開発
クロスプラットフォームのモバイルアプリケーションを構築します。
使用する場面
- React Native 開発
- Flutter 開発
- モバイルのパフォーマンス問題
- ネイティブモジュールの統合
- アプリストアへの公開
React Native
コンポーネント構成
import React, { useState, useCallback } from "react";
import { View, Text, TouchableOpacity, StyleSheet } from "react-native";
interface Props {
title: string;
onPress: () => void;
}
export function Button({ title, onPress }: Props) {
const [pressed, setPressed] = useState(false);
const handlePress = useCallback(() => {
setPressed(true);
onPress();
}, [onPress]);
return (
<TouchableOpacity
style={[styles.button, pressed && styles.pressed]}
onPress={handlePress}
activeOpacity={0.7}
>
<Text style={styles.text}>{title}</Text>
</TouchableOpacity>
);
}
const styles = StyleSheet.create({
button: {
backgroundColor: "#007AFF",
padding: 16,
borderRadius: 8,
},
pressed: {
opacity: 0.8,
},
text: {
color: "white",
fontWeight: "600",
textAlign: "center",
},
});
ナビゲーション
import { NavigationContainer } from "@react-navigation/native";
import { createNativeStackNavigator } from "@react-navigation/native-stack";
type RootStackParamList = {
Home: undefined;
Details: { id: string };
};
const Stack = createNativeStackNavigator<RootStackParamList>();
function App() {
return (
<NavigationContainer>
<Stack.Navigator>
<Stack.Screen name="Home" component={HomeScreen} />
<Stack.Screen name="Details" component={DetailsScreen} />
</Stack.Navigator>
</NavigationContainer>
);
}
Flutter
ウィジェット構成
class MyButton extends StatelessWidget {
final String title;
final VoidCallback onPressed;
const MyButton({
Key? key,
required this.title,
required this.onPressed,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: onPressed,
style: ElevatedButton.styleFrom(
padding: const EdgeInsets.all(16),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8),
),
),
child: Text(title),
);
}
}
パフォーマンスのヒント
- 長いリストには FlatList/ListView を使用します
- useCallback でコールバックをメモ化します
- インラインスタイルは避けます(StyleSheet を使用します)
- 画面と画像は遅延読み込みします
- Flipper/DevTools でプロファイリングします
よく使われるパターン
| パターン | React Native | Flutter |
|---|---|---|
| 状態 | useState/Redux | setState/Riverpod |
| ナビゲーション | React Navigation | Navigator 2.0 |
| HTTP | fetch/axios | http/dio |
| ストレージ | AsyncStorage | shared_preferences |
| アニメーション | Animated/Reanimated | AnimationController |
例
入力:「リスト画面を構築する」 **アクション:**仮想化、プルして更新、ページネーションに対応した FlatList を作成します
入力:「オフライン対応を追加する」 **アクション:**AsyncStorage によるキャッシュ、同期キュー、ネットワーク検出を実装します
コメント
Markdown 対応