plugins/languages/flutter/skills/android/SKILL.md
Flutter Android 平台规范 — Material 3 Expressive、Impeller (Android 默认启用)、动态颜色 (Dynamic Color)、permission_handler 权限流程、App Bundle / R8 包体优化、Logcat/ADB 调试。当用户开发 Android 端、提到 "Android"、"Material 3"、"权限"、"APK"、"AAB"、"Logcat"、"平台通道" 时加载。
npx skillsauth add lazygophers/ccplugin flutter-androidInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
MaterialApp(
theme: ThemeData(
useMaterial3: true,
colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
cardTheme: const CardTheme(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(16))),
),
),
);
// 动态颜色 (Android 12+)
import 'package:dynamic_color/dynamic_color.dart';
DynamicColorBuilder(
builder: (light, dark) => MaterialApp(
theme: ThemeData(
useMaterial3: true,
colorScheme: light ?? ColorScheme.fromSeed(seedColor: Colors.blue),
),
darkTheme: ThemeData(
useMaterial3: true,
colorScheme: dark ?? ColorScheme.fromSeed(seedColor: Colors.blue, brightness: Brightness.dark),
),
),
);
// NavigationBar (替代 BottomNavigationBar)
NavigationBar(
selectedIndex: idx,
onDestinationSelected: (i) => setState(() => idx = i),
destinations: const [
NavigationDestination(icon: Icon(Icons.home), label: 'Home'),
NavigationDestination(icon: Icon(Icons.search), label: 'Search'),
],
);
// SearchAnchor (M3 搜索)
SearchAnchor(
builder: (ctx, ctrl) => SearchBar(controller: ctrl, hintText: 'Search...'),
suggestionsBuilder: (ctx, ctrl) => suggestions,
);
Flutter 3.27 起 Impeller 是 Android 默认渲染引擎,消除 shader compilation jank。
<!-- 如需禁用 (回退 Skia): AndroidManifest.xml -->
<meta-data android:name="io.flutter.embedding.android.EnableImpeller" android:value="false" />
优化要点:
Opacity widget → 用 color.withValues(alpha: …)ClipRRect + shadowRepaintBoundary 隔离复杂动画子树// 1. 图片降采样
Image.asset('assets/big.png', cacheWidth: 200, cacheHeight: 200);
// 2. Isolate 卸载 CPU 密集
final result = await Isolate.run(() => heavyCompute(data));
// 3. 启动期最小化同步操作
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await initCritical(); // 仅关键服务
runApp(const MyApp());
}
import 'package:permission_handler/permission_handler.dart';
Future<void> requestCamera() async {
final status = await Permission.camera.request();
switch (status) {
case PermissionStatus.granted: break;
case PermissionStatus.denied: /* 提示后再请 */ break;
case PermissionStatus.permanentlyDenied:
await openAppSettings();
default: break;
}
}
AndroidManifest.xml 需声明对应权限 + Android 13+ 细粒度媒体权限 (READ_MEDIA_IMAGES 等)。
# App Bundle (Play Store 必需)
flutter build appbundle --release --split-debug-info=build/debug-info --obfuscate
# 拆 ABI APK
flutter build apk --release --split-per-abi
# 包体分析
flutter build apk --analyze-size
android/app/build.gradle:
minSdkVersion 23targetSdkVersion 跟随 Play Store 政策minifyEnabled true + shrinkResources true)testWidgets('NavigationBar works', (tester) async {
await tester.pumpWidget(const ProviderScope(child: MaterialApp(home: MainPage())));
await tester.tap(find.text('Search'));
await tester.pumpAndSettle();
expect(find.byType(SearchPage), findsOneWidget);
});
| AI 借口 | 实际检查 | 严重度 |
| --- | --- | --- |
| "Material 2 也行" | 是否 useMaterial3: true + M3 组件? | 高 |
| "Opacity 更方便" | 是否避免 Opacity widget? | 中 |
| "权限直接请求" | 拒绝/永久拒绝是否处理? | 高 |
| "BottomNavigationBar 够了" | 是否用 NavigationBar? | 中 |
| "APK 发布就行" | Play Store 要求 AAB | 高 |
useMaterial3: true + ColorScheme.fromSeeddynamic_color) 支持 Android 12+NavigationBar / SearchAnchor / FilledButton)--split-debug-info + --obfuscateSkills(flutter:core) / Skills(flutter:ui) / Skills(flutter:state)tools
UI/UX 与布局设计——做界面布局/结构/导航/组件/交互的设计决策。触发:做UI/UX/布局/排版/导航/组件/交互/栅格/响应式/图表选型/字体配对。按媒介路由 HTML/Web、原生 App(iOS/Android/桌面)、CLI、TUI。需后端动态系统不适用;配色/主题/色板走姊妹 skill design-color。
tools
主题与配色设计——做颜色搭配/调色板/主题/品牌色阶/暗模式的设计决策。触发:选配色/调色/主题/色板/品牌色/暗模式/对比度/色盲/UI风格。按媒介路由 HTML/Web(CSS变量)、原生App(平台token)、CLI(ANSI)、TUI(真彩/256/16降级)。保证可访问性(对比度/色盲安全)。需后端动态系统不适用;UI/UX 布局/组件/交互走姊妹 skill design-uiux。
tools
跨任意组件(plugin/skill/agent/command)的验证驱动优化循环纪律 skill。当用户要优化某个已有组件却无明确方向、或要防止改了反而更差(自评乐观偏差 / 多维同改归因失效 / 为凑分加废话膨胀)、或要把一套通用「评分→单变量改→改后验证严格更好才留否则回滚→触顶停」的纪律套到任意组件上时使用。管优化过程本身的纪律(validation gate / ratchet / 独立验证 / 触顶停),不评单组件深度(交 skill-dev),不查插件接线(交 plugin-dev)。仅手动 /optimize-any 触发。
data-ai
两层规则记忆 (基于 .skein/spec)。planning 时 recall 召回相关规则、task finish 后 sediment 沉淀学习 + prune 自动精简过期/重复/断链规则。core 常驻硬规 + recall 按需召回, 经判定门自动写盘 (不逐次问用户)。产出 .skein/spec 下 core/recall 规则文件 + index。另支持空仓 bootstrap 播种规则基线、记忆大面积失效 (大重构/换栈) 时 reconstruct 可逆归档后按项目类型分型重建、maintain 手动体检 (超预算/stale/断链/重复/废弃, --apply 自动修复)、auto-fix (Stop hook 写 .pending-fix 标记 → main 派 skein-specer bg 跑 maintain --apply 全自动修, 断链只报告)。