npx claudepluginhub dvrd/ui-studio --plugin dvrdThis skill uses the workspace's default tool permissions.
Creates a Flutter screen that integrates with the Go backend.
Build cross-platform iOS/Android apps with Flutter and Dart. Covers widgets, state management (Provider/BLoC), navigation, API integration, and Material Design best practices.
Provides expert Flutter/Dart patterns for cross-platform mobile apps including feature-first project structure, const widget best practices, and Riverpod/Bloc state management.
Provides production-ready Dart/Flutter patterns for null safety, immutable state, async composition, BLoC/Riverpod/Provider state management, GoRouter navigation, Dio networking, Freezed code gen, testing, and clean architecture.
Share bugs, ideas, or general feedback.
Creates a Flutter screen that integrates with the Go backend.
Confirm with user:
screenName — PascalCase screen name (e.g. CampaignsScreen, DashboardScreen)Read the Go handler for the target API endpoint to get request/response types
Read templui: list_resources() to understand the design tokens and color palette (for visual parity with web)
Write lib/models/{snake_name}.dart:
json_serializable annotationsfromJson factory constructorWrite lib/repositories/{snake_name}_repository.dart:
Dio HTTP client with JWT bearer tokenWrite lib/providers/{snake_name}_provider.dart:
AsyncNotifier (Riverpod)Write lib/screens/{snake_name}_screen.dart:
ConsumerWidget or ConsumerStatefulWidgetCircularProgressIndicator skeletonRegister route in lib/router.dart (GoRouter)
Run dart analyze — fix all errors
Run dart format .
// Read JWT from secure storage
final storage = FlutterSecureStorage();
final token = await storage.read(key: 'access_token');
// Attach to all requests
dio.interceptors.add(InterceptorsWrapper(
onRequest: (options, handler) async {
final token = await storage.read(key: 'access_token');
if (token != null) options.headers['Authorization'] = 'Bearer $token';
handler.next(options);
},
onError: (error, handler) async {
if (error.response?.statusCode == 401) {
// refresh token or redirect to login
}
handler.next(error);
},
));
dart analyze passes with 0 errors