mcpField
M
mobile

mobile

github.com/htlin222開発7836 回インストール3 週間前に更新
リポジトリ

mobile について

mobileは、クロスプラットフォームのモバイルアプリ開発者向けスキルです。React NativeとFlutterのコンポーネント、ナビゲーション、性能改善、ネイティブモジュール、アプリストアへの公開例を扱います。

主な機能

  1. 01React Nativeの開発パターン
  2. 02Flutterの開発パターン
  3. 03ナビゲーションと状態管理の解説
  4. 04モバイル性能改善の指針
  5. 05ネイティブモジュールとアプリ公開への対応

活用シーン

  1. 01モバイルアプリのリスト画面を構築
  2. 02ナビゲーションと状態管理を実装
  3. 03モバイルアプリの性能問題を調査
  4. 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 NativeFlutter
状態useState/ReduxsetState/Riverpod
ナビゲーションReact NavigationNavigator 2.0
HTTPfetch/axioshttp/dio
ストレージAsyncStorageshared_preferences
アニメーションAnimated/ReanimatedAnimationController

例

入力:「リスト画面を構築する」 **アクション:**仮想化、プルして更新、ページネーションに対応した FlatList を作成します

入力:「オフライン対応を追加する」 **アクション:**AsyncStorage によるキャッシュ、同期キュー、ネットワーク検出を実装します

コメント