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)development
Go 数据库规范——GORM Model 命名 ModelXxx、表名单数、枚举 uint8 + 常量、索引 idx_ 前缀 + deleted_at leading column、禁 time.Time 统一 int64 unix、禁指针/nullable 字段、TEXT/BLOB/JSON 禁 default、AutoMigrate 禁改主键。设计 DB model、写 GORM tag、建索引、做 migration 审查时触发。
development
Go HTTP API 规范——响应始终 200 + body code 字段、路由 /api/* 全 POST 单段 <Action><Model>、中间件逐路由注册禁 Group(prefix,mw...)、handler 仅返回 (rsp,error)、认证走 header。设计 HTTP API、写路由/handler/中间件时触发。
development
Go 项目结构规范——三层架构(API → Impl → State)、全局状态模式、internal/ 私有包、cmd/ 仅 main.go、go.work 多模块、禁止 Repository 接口和 DI 容器、struct 公共字段开头全 omitempty、handler var rsp 顶声明、禁 legacy migration。设计项目骨架、新建目录、组织包、做架构评审时触发。
development
Go 命名规范——Id/Uid 字段(非 ID)、IsActive/HasMFA 布尔前缀、CreatedAt 时间字段、接收者统一用 p、包名全小写无下划线、泛型类型参数描述性命名、集合字段 xxx_list 禁 xxxs 复数、Enum 0 值 XxxNil 禁 Unknown、禁 Status 统一 State、Set/Update 语义区分。定义结构体字段、函数、变量、包、接收者名、泛型、枚举时触发。