@ngxtm/devkit 3.4.0 → 3.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -1
- package/rules/README.md +141 -0
- package/rules/dart/best-practices/SKILL.md +23 -0
- package/rules/dart/language/SKILL.md +52 -0
- package/rules/dart/tooling/SKILL.md +43 -0
- package/rules/dotnet/aspnet-core/SKILL.md +92 -0
- package/rules/dotnet/aspnet-core/references/REFERENCE.md +335 -0
- package/rules/dotnet/best-practices/SKILL.md +101 -0
- package/rules/dotnet/best-practices/references/REFERENCE.md +256 -0
- package/rules/dotnet/blazor/SKILL.md +146 -0
- package/rules/dotnet/blazor/references/REFERENCE.md +392 -0
- package/rules/dotnet/language/SKILL.md +82 -0
- package/rules/dotnet/language/references/REFERENCE.md +222 -0
- package/rules/dotnet/patterns.rule.md +388 -0
- package/rules/dotnet/razor-pages/SKILL.md +124 -0
- package/rules/dotnet/razor-pages/references/REFERENCE.md +321 -0
- package/rules/dotnet/security/SKILL.md +89 -0
- package/rules/dotnet/security/references/REFERENCE.md +295 -0
- package/rules/dotnet/tooling/SKILL.md +92 -0
- package/rules/dotnet/tooling/references/REFERENCE.md +300 -0
- package/rules/flutter/auto-route-navigation/SKILL.md +43 -0
- package/rules/flutter/auto-route-navigation/references/REFERENCE.md +19 -0
- package/rules/flutter/auto-route-navigation/references/router-config.md +62 -0
- package/rules/flutter/bloc-state-management/SKILL.md +64 -0
- package/rules/flutter/bloc-state-management/references/REFERENCE.md +20 -0
- package/rules/flutter/bloc-state-management/references/auth-bloc-example.md +52 -0
- package/rules/flutter/bloc-state-management/references/equatable-usage.md +56 -0
- package/rules/flutter/bloc-state-management/references/property-based-state.md +68 -0
- package/rules/flutter/bloc.rule.md +76 -0
- package/rules/flutter/cicd/SKILL.md +48 -0
- package/rules/flutter/cicd/references/advanced-workflow.md +66 -0
- package/rules/flutter/cicd/references/fastlane.md +139 -0
- package/rules/flutter/cicd/references/github-actions.md +59 -0
- package/rules/flutter/dependency-injection/SKILL.md +42 -0
- package/rules/flutter/dependency-injection/references/REFERENCE.md +15 -0
- package/rules/flutter/dependency-injection/references/modules.md +37 -0
- package/rules/flutter/error-handling/SKILL.md +32 -0
- package/rules/flutter/error-handling/references/REFERENCE.md +19 -0
- package/rules/flutter/error-handling/references/error-mapping.md +31 -0
- package/rules/flutter/feature-based-clean-architecture/SKILL.md +46 -0
- package/rules/flutter/feature-based-clean-architecture/references/REFERENCE.md +14 -0
- package/rules/flutter/feature-based-clean-architecture/references/folder-structure.md +36 -0
- package/rules/flutter/getx-navigation/SKILL.md +70 -0
- package/rules/flutter/getx-navigation/references/app-pages.md +40 -0
- package/rules/flutter/getx-navigation/references/middleware-example.md +29 -0
- package/rules/flutter/getx-state-management/SKILL.md +76 -0
- package/rules/flutter/getx-state-management/references/binding-example.md +32 -0
- package/rules/flutter/getx-state-management/references/reactive-vs-simple.md +39 -0
- package/rules/flutter/go-router-navigation/SKILL.md +57 -0
- package/rules/flutter/idiomatic-flutter/SKILL.md +20 -0
- package/rules/flutter/layer-based-clean-architecture/SKILL.md +50 -0
- package/rules/flutter/layer-based-clean-architecture/references/REFERENCE.md +60 -0
- package/rules/flutter/layer-based-clean-architecture/references/repository-mapping.md +50 -0
- package/rules/flutter/localization/SKILL.md +50 -0
- package/rules/flutter/localization/references/REFERENCE.md +48 -0
- package/rules/flutter/localization/references/sheet-loader.md +33 -0
- package/rules/flutter/navigator-v1-navigation/SKILL.md +71 -0
- package/rules/flutter/navigator-v1-navigation/references/on-generate-route.md +48 -0
- package/rules/flutter/performance/SKILL.md +24 -0
- package/rules/flutter/retrofit-networking/SKILL.md +51 -0
- package/rules/flutter/retrofit-networking/references/REFERENCE.md +19 -0
- package/rules/flutter/retrofit-networking/references/token-refresh.md +40 -0
- package/rules/flutter/riverpod-state-management/SKILL.md +53 -0
- package/rules/flutter/riverpod-state-management/references/architecture.md +124 -0
- package/rules/flutter/riverpod-state-management/references/best-practices.md +89 -0
- package/rules/flutter/riverpod-state-management/references/testing.md +73 -0
- package/rules/flutter/riverpod.rule.md +78 -0
- package/rules/flutter/security/SKILL.md +33 -0
- package/rules/flutter/security/references/REFERENCE.md +15 -0
- package/rules/flutter/security/references/network-security.md +28 -0
- package/rules/flutter/testing/SKILL.md +44 -0
- package/rules/flutter/testing/references/REFERENCE.md +21 -0
- package/rules/flutter/testing/references/bloc-testing.md +38 -0
- package/rules/flutter/testing/references/integration-testing.md +128 -0
- package/rules/flutter/testing/references/robot-pattern.md +82 -0
- package/rules/flutter/testing/references/unit-testing.md +130 -0
- package/rules/flutter/testing/references/widget-testing.md +120 -0
- package/rules/flutter/widgets/SKILL.md +37 -0
- package/rules/golang/chi-router/SKILL.md +219 -0
- package/rules/golang/chi-router/references/REFERENCE.md +13 -0
- package/rules/golang/chi-router/references/routing-patterns.md +205 -0
- package/rules/golang/cobra-cli/SKILL.md +227 -0
- package/rules/golang/cobra-cli/references/REFERENCE.md +13 -0
- package/rules/golang/cobra-cli/references/command-patterns.md +224 -0
- package/rules/golang/core/SKILL.md +210 -0
- package/rules/golang/core/references/REFERENCE.md +14 -0
- package/rules/golang/core/references/concurrency-patterns.md +114 -0
- package/rules/golang/core/references/error-handling.md +87 -0
- package/rules/golang/echo-framework/SKILL.md +215 -0
- package/rules/golang/echo-framework/references/REFERENCE.md +14 -0
- package/rules/golang/echo-framework/references/middleware-patterns.md +141 -0
- package/rules/golang/echo-framework/references/routing-patterns.md +140 -0
- package/rules/golang/ent-orm/SKILL.md +239 -0
- package/rules/golang/ent-orm/references/REFERENCE.md +13 -0
- package/rules/golang/ent-orm/references/schema-patterns.md +255 -0
- package/rules/golang/fiber-framework/SKILL.md +196 -0
- package/rules/golang/fiber-framework/references/REFERENCE.md +13 -0
- package/rules/golang/fiber-framework/references/routing-patterns.md +191 -0
- package/rules/golang/gin-framework/SKILL.md +205 -0
- package/rules/golang/gin-framework/references/REFERENCE.md +14 -0
- package/rules/golang/gin-framework/references/middleware-patterns.md +119 -0
- package/rules/golang/gorm-orm/SKILL.md +196 -0
- package/rules/golang/gorm-orm/references/REFERENCE.md +14 -0
- package/rules/golang/gorm-orm/references/model-definitions.md +167 -0
- package/rules/golang/gorm-orm/references/query-patterns.md +161 -0
- package/rules/golang/grpc/SKILL.md +231 -0
- package/rules/golang/grpc/references/REFERENCE.md +13 -0
- package/rules/golang/grpc/references/service-patterns.md +276 -0
- package/rules/golang/testify/SKILL.md +239 -0
- package/rules/golang/testify/references/REFERENCE.md +13 -0
- package/rules/golang/testify/references/assert-patterns.md +170 -0
- package/rules/golang/validator/SKILL.md +234 -0
- package/rules/golang/validator/references/REFERENCE.md +13 -0
- package/rules/golang/validator/references/validation-tags.md +211 -0
- package/rules/golang/viper-config/SKILL.md +244 -0
- package/rules/golang/viper-config/references/REFERENCE.md +13 -0
- package/rules/golang/viper-config/references/config-loading.md +181 -0
- package/rules/golang/wire-di/SKILL.md +243 -0
- package/rules/golang/wire-di/references/REFERENCE.md +13 -0
- package/rules/golang/wire-di/references/provider-patterns.md +193 -0
- package/rules/golang/zap-logging/SKILL.md +203 -0
- package/rules/golang/zap-logging/references/REFERENCE.md +13 -0
- package/rules/golang/zap-logging/references/logger-config.md +165 -0
- package/rules/java/build-gradle/SKILL.md +92 -0
- package/rules/java/build-gradle/references/REFERENCE.md +14 -0
- package/rules/java/build-gradle/references/kotlin-dsl.md +118 -0
- package/rules/java/build-gradle/references/task-configuration.md +132 -0
- package/rules/java/build-maven/SKILL.md +86 -0
- package/rules/java/build-maven/references/REFERENCE.md +14 -0
- package/rules/java/build-maven/references/dependency-management.md +111 -0
- package/rules/java/build-maven/references/lifecycle-phases.md +114 -0
- package/rules/java/graalvm-native/SKILL.md +105 -0
- package/rules/java/graalvm-native/references/REFERENCE.md +12 -0
- package/rules/java/java-collections-streams/SKILL.md +148 -0
- package/rules/java/java-collections-streams/references/REFERENCE.md +15 -0
- package/rules/java/java-collections-streams/references/collectors-patterns.md +178 -0
- package/rules/java/java-collections-streams/references/stream-pipelines.md +165 -0
- package/rules/java/java-concurrency/SKILL.md +187 -0
- package/rules/java/java-concurrency/references/REFERENCE.md +17 -0
- package/rules/java/java-concurrency/references/completable-future.md +165 -0
- package/rules/java/java-concurrency/references/executor-patterns.md +176 -0
- package/rules/java/java-concurrency/references/virtual-threads.md +190 -0
- package/rules/java/java-core-language/SKILL.md +121 -0
- package/rules/java/java-core-language/references/REFERENCE.md +15 -0
- package/rules/java/java-core-language/references/jvm-memory-model.md +160 -0
- package/rules/java/java-core-language/references/modern-java-features.md +168 -0
- package/rules/java/java-project-structure/SKILL.md +195 -0
- package/rules/java/java-project-structure/references/REFERENCE.md +15 -0
- package/rules/java/java-project-structure/references/maven-project-layout.md +199 -0
- package/rules/java/java-project-structure/references/module-system.md +159 -0
- package/rules/java/micronaut-core/SKILL.md +99 -0
- package/rules/java/micronaut-core/references/REFERENCE.md +12 -0
- package/rules/java/micronaut-reactive/SKILL.md +68 -0
- package/rules/java/micronaut-reactive/references/REFERENCE.md +12 -0
- package/rules/java/quarkus-core/SKILL.md +85 -0
- package/rules/java/quarkus-core/references/REFERENCE.md +12 -0
- package/rules/java/quarkus-reactive/SKILL.md +67 -0
- package/rules/java/quarkus-reactive/references/REFERENCE.md +12 -0
- package/rules/java/spring-batch/SKILL.md +102 -0
- package/rules/java/spring-batch/references/REFERENCE.md +12 -0
- package/rules/java/spring-boot-architecture/SKILL.md +206 -0
- package/rules/java/spring-boot-architecture/references/REFERENCE.md +15 -0
- package/rules/java/spring-boot-architecture/references/auto-configuration.md +158 -0
- package/rules/java/spring-boot-architecture/references/configuration-properties.md +202 -0
- package/rules/java/spring-boot-web/SKILL.md +217 -0
- package/rules/java/spring-boot-web/references/REFERENCE.md +17 -0
- package/rules/java/spring-cloud/SKILL.md +109 -0
- package/rules/java/spring-cloud/references/REFERENCE.md +13 -0
- package/rules/java/spring-data-jpa/SKILL.md +241 -0
- package/rules/java/spring-data-jpa/references/REFERENCE.md +16 -0
- package/rules/java/spring-security/SKILL.md +161 -0
- package/rules/java/spring-security/references/REFERENCE.md +16 -0
- package/rules/java/spring-security/references/jwt-auth-flow.md +213 -0
- package/rules/java/testing-junit-mockito/SKILL.md +135 -0
- package/rules/java/testing-junit-mockito/references/REFERENCE.md +15 -0
- package/rules/java/testing-junit-mockito/references/junit5-patterns.md +159 -0
- package/rules/java/testing-junit-mockito/references/mockito-patterns.md +148 -0
- package/rules/java/testing-junit-mockito/references/spring-boot-testing.md +152 -0
- package/rules/javascript/best-practices/SKILL.md +64 -0
- package/rules/javascript/best-practices/references/REFERENCE.md +91 -0
- package/rules/javascript/language/SKILL.md +71 -0
- package/rules/javascript/language/references/REFERENCE.md +106 -0
- package/rules/javascript/tooling/SKILL.md +60 -0
- package/rules/javascript/tooling/references/REFERENCE.md +107 -0
- package/rules/metadata.json +54 -0
- package/rules/nestjs/api-standards/SKILL.md +47 -0
- package/rules/nestjs/api-standards/references/pagination-wrapper.md +87 -0
- package/rules/nestjs/architecture/SKILL.md +68 -0
- package/rules/nestjs/architecture/references/dynamic-module.md +53 -0
- package/rules/nestjs/caching/SKILL.md +51 -0
- package/rules/nestjs/caching/references/REFERENCE.md +13 -0
- package/rules/nestjs/caching/references/cache-patterns.md +183 -0
- package/rules/nestjs/configuration/SKILL.md +41 -0
- package/rules/nestjs/configuration/references/REFERENCE.md +13 -0
- package/rules/nestjs/configuration/references/config-patterns.md +184 -0
- package/rules/nestjs/controllers-services/SKILL.md +63 -0
- package/rules/nestjs/controllers-services/references/REFERENCE.md +14 -0
- package/rules/nestjs/controllers-services/references/controller-patterns.md +119 -0
- package/rules/nestjs/controllers-services/references/service-patterns.md +129 -0
- package/rules/nestjs/database/SKILL.md +102 -0
- package/rules/nestjs/database/references/REFERENCE.md +14 -0
- package/rules/nestjs/database/references/typeorm-patterns.md +156 -0
- package/rules/nestjs/deployment/SKILL.md +36 -0
- package/rules/nestjs/deployment/references/REFERENCE.md +13 -0
- package/rules/nestjs/deployment/references/deployment-patterns.md +140 -0
- package/rules/nestjs/documentation/SKILL.md +64 -0
- package/rules/nestjs/documentation/references/REFERENCE.md +13 -0
- package/rules/nestjs/documentation/references/swagger-patterns.md +139 -0
- package/rules/nestjs/error-handling/SKILL.md +55 -0
- package/rules/nestjs/error-handling/references/REFERENCE.md +13 -0
- package/rules/nestjs/error-handling/references/exception-filters.md +152 -0
- package/rules/nestjs/file-uploads/SKILL.md +35 -0
- package/rules/nestjs/file-uploads/references/REFERENCE.md +13 -0
- package/rules/nestjs/file-uploads/references/upload-patterns.md +125 -0
- package/rules/nestjs/observability/SKILL.md +39 -0
- package/rules/nestjs/observability/references/REFERENCE.md +13 -0
- package/rules/nestjs/observability/references/logging-metrics.md +175 -0
- package/rules/nestjs/performance/SKILL.md +60 -0
- package/rules/nestjs/performance/references/REFERENCE.md +13 -0
- package/rules/nestjs/performance/references/performance-patterns.md +107 -0
- package/rules/nestjs/real-time/SKILL.md +45 -0
- package/rules/nestjs/real-time/references/REFERENCE.md +13 -0
- package/rules/nestjs/real-time/references/websocket-patterns.md +121 -0
- package/rules/nestjs/scheduling/SKILL.md +39 -0
- package/rules/nestjs/scheduling/references/REFERENCE.md +13 -0
- package/rules/nestjs/scheduling/references/scheduling-patterns.md +137 -0
- package/rules/nestjs/search/SKILL.md +41 -0
- package/rules/nestjs/search/references/REFERENCE.md +13 -0
- package/rules/nestjs/search/references/search-patterns.md +137 -0
- package/rules/nestjs/security/SKILL.md +87 -0
- package/rules/nestjs/security/references/REFERENCE.md +14 -0
- package/rules/nestjs/security/references/authentication.md +151 -0
- package/rules/nestjs/testing/SKILL.md +40 -0
- package/rules/nestjs/testing/references/REFERENCE.md +14 -0
- package/rules/nestjs/testing/references/unit-testing.md +179 -0
- package/rules/nestjs/transport/SKILL.md +45 -0
- package/rules/nestjs/transport/references/REFERENCE.md +13 -0
- package/rules/nestjs/transport/references/microservices-patterns.md +170 -0
- package/rules/nextjs/app-router/SKILL.md +46 -0
- package/rules/nextjs/app-router/references/REFERENCE.md +14 -0
- package/rules/nextjs/app-router/references/routing-patterns.md +182 -0
- package/rules/nextjs/architecture/SKILL.md +44 -0
- package/rules/nextjs/architecture/references/fsd-structure.md +77 -0
- package/rules/nextjs/authentication/SKILL.md +29 -0
- package/rules/nextjs/authentication/references/auth-implementation.md +73 -0
- package/rules/nextjs/caching/SKILL.md +66 -0
- package/rules/nextjs/caching/references/REFERENCE.md +13 -0
- package/rules/nextjs/caching/references/cache-strategies.md +168 -0
- package/rules/nextjs/data-access-layer/SKILL.md +33 -0
- package/rules/nextjs/data-access-layer/references/patterns.md +66 -0
- package/rules/nextjs/data-fetching/SKILL.md +59 -0
- package/rules/nextjs/data-fetching/references/REFERENCE.md +13 -0
- package/rules/nextjs/data-fetching/references/fetch-patterns.md +160 -0
- package/rules/nextjs/internationalization/SKILL.md +105 -0
- package/rules/nextjs/internationalization/references/REFERENCE.md +13 -0
- package/rules/nextjs/internationalization/references/i18n-patterns.md +180 -0
- package/rules/nextjs/optimization/SKILL.md +64 -0
- package/rules/nextjs/optimization/references/REFERENCE.md +13 -0
- package/rules/nextjs/optimization/references/optimization-patterns.md +190 -0
- package/rules/nextjs/rendering/SKILL.md +91 -0
- package/rules/nextjs/rendering/references/REFERENCE.md +13 -0
- package/rules/nextjs/rendering/references/rendering-modes.md +163 -0
- package/rules/nextjs/server-actions/SKILL.md +46 -0
- package/rules/nextjs/server-actions/references/REFERENCE.md +13 -0
- package/rules/nextjs/server-actions/references/action-patterns.md +188 -0
- package/rules/nextjs/server-components/SKILL.md +52 -0
- package/rules/nextjs/server-components/references/REFERENCE.md +13 -0
- package/rules/nextjs/server-components/references/component-patterns.md +175 -0
- package/rules/nextjs/state-management/SKILL.md +73 -0
- package/rules/nextjs/state-management/references/REFERENCE.md +13 -0
- package/rules/nextjs/state-management/references/state-patterns.md +218 -0
- package/rules/nextjs/styling/SKILL.md +31 -0
- package/rules/nextjs/styling/references/implementation.md +56 -0
- package/rules/react/component-patterns/SKILL.md +66 -0
- package/rules/react/component-patterns/references/REFERENCE.md +126 -0
- package/rules/react/hooks/SKILL.md +60 -0
- package/rules/react/hooks/references/REFERENCE.md +132 -0
- package/rules/react/hooks.rule.md +79 -0
- package/rules/react/performance/SKILL.md +69 -0
- package/rules/react/performance/references/REFERENCE.md +143 -0
- package/rules/react/security/SKILL.md +46 -0
- package/rules/react/security/references/REFERENCE.md +170 -0
- package/rules/react/state-management/SKILL.md +56 -0
- package/rules/react/state-management/references/REFERENCE.md +137 -0
- package/rules/react/testing/SKILL.md +45 -0
- package/rules/react/testing/references/REFERENCE.md +149 -0
- package/rules/react/tooling/SKILL.md +39 -0
- package/rules/react/typescript/SKILL.md +53 -0
- package/rules/rust/actix-web/SKILL.md +160 -0
- package/rules/rust/actix-web/references/REFERENCE.md +13 -0
- package/rules/rust/actix-web/references/handler-patterns.md +198 -0
- package/rules/rust/async-graphql/SKILL.md +228 -0
- package/rules/rust/async-graphql/references/REFERENCE.md +13 -0
- package/rules/rust/async-graphql/references/schema-patterns.md +215 -0
- package/rules/rust/axum/SKILL.md +161 -0
- package/rules/rust/axum/references/REFERENCE.md +14 -0
- package/rules/rust/axum/references/handler-patterns.md +97 -0
- package/rules/rust/bevy/SKILL.md +206 -0
- package/rules/rust/bevy/references/REFERENCE.md +13 -0
- package/rules/rust/bevy/references/ecs-patterns.md +226 -0
- package/rules/rust/clap/SKILL.md +217 -0
- package/rules/rust/clap/references/REFERENCE.md +13 -0
- package/rules/rust/clap/references/derive-patterns.md +205 -0
- package/rules/rust/core/SKILL.md +154 -0
- package/rules/rust/core/references/REFERENCE.md +14 -0
- package/rules/rust/core/references/error-handling.md +92 -0
- package/rules/rust/diesel-orm/SKILL.md +176 -0
- package/rules/rust/diesel-orm/references/REFERENCE.md +13 -0
- package/rules/rust/diesel-orm/references/schema-patterns.md +206 -0
- package/rules/rust/rocket/SKILL.md +182 -0
- package/rules/rust/rocket/references/REFERENCE.md +13 -0
- package/rules/rust/rocket/references/handler-patterns.md +209 -0
- package/rules/rust/sea-orm/SKILL.md +230 -0
- package/rules/rust/sea-orm/references/REFERENCE.md +13 -0
- package/rules/rust/sea-orm/references/entity-patterns.md +221 -0
- package/rules/rust/serde-serialization/SKILL.md +150 -0
- package/rules/rust/serde-serialization/references/REFERENCE.md +13 -0
- package/rules/rust/serde-serialization/references/serialization-patterns.md +199 -0
- package/rules/rust/sqlx-database/SKILL.md +140 -0
- package/rules/rust/sqlx-database/references/REFERENCE.md +13 -0
- package/rules/rust/sqlx-database/references/query-patterns.md +210 -0
- package/rules/rust/tauri/SKILL.md +180 -0
- package/rules/rust/tauri/references/REFERENCE.md +13 -0
- package/rules/rust/tauri/references/command-patterns.md +209 -0
- package/rules/rust/tokio-runtime/SKILL.md +167 -0
- package/rules/rust/tokio-runtime/references/REFERENCE.md +14 -0
- package/rules/rust/tokio-runtime/references/async-patterns.md +137 -0
- package/rules/rust/tokio-runtime/references/synchronization.md +152 -0
- package/rules/rust/tonic/SKILL.md +231 -0
- package/rules/rust/tonic/references/REFERENCE.md +13 -0
- package/rules/rust/tonic/references/service-patterns.md +213 -0
- package/rules/rust/tracing/SKILL.md +214 -0
- package/rules/rust/tracing/references/REFERENCE.md +13 -0
- package/rules/rust/tracing/references/instrumentation.md +187 -0
- package/rules/typescript/best-practices/SKILL.md +108 -0
- package/rules/typescript/best-practices/references/REFERENCE.md +68 -0
- package/rules/typescript/language/SKILL.md +72 -0
- package/rules/typescript/language/references/REFERENCE.md +67 -0
- package/rules/typescript/patterns.rule.md +85 -0
- package/rules/typescript/security/SKILL.md +59 -0
- package/rules/typescript/security/references/REFERENCE.md +113 -0
- package/rules/typescript/tooling/SKILL.md +52 -0
- package/rules/typescript/tooling/references/REFERENCE.md +110 -0
- package/skills/learn/SKILL.md +476 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Flutter GetX State Management
|
|
3
|
+
description: Simple and powerful reactive state management using GetX.
|
|
4
|
+
metadata:
|
|
5
|
+
labels: [state-management, getx, controller, reactive]
|
|
6
|
+
triggers:
|
|
7
|
+
files: ['**_controller.dart', '**/bindings/*.dart']
|
|
8
|
+
keywords:
|
|
9
|
+
[GetxController, Obx, GetBuilder, .obs, Get.put, Get.find, Get.lazyPut]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# GetX State Management
|
|
13
|
+
|
|
14
|
+
## **Priority: P0 (CRITICAL)**
|
|
15
|
+
|
|
16
|
+
Reactive and lightweight state management separating business logic from UI using `GetX`.
|
|
17
|
+
|
|
18
|
+
## Structure
|
|
19
|
+
|
|
20
|
+
```text
|
|
21
|
+
lib/app/modules/home/
|
|
22
|
+
├── controllers/
|
|
23
|
+
│ └── home_controller.dart
|
|
24
|
+
├── bindings/
|
|
25
|
+
│ └── home_binding.dart
|
|
26
|
+
└── views/
|
|
27
|
+
└── home_view.dart
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Implementation Guidelines
|
|
31
|
+
|
|
32
|
+
- **Controllers**: Extend `GetxController`. Store logic and state variables here.
|
|
33
|
+
- **Reactivity**:
|
|
34
|
+
- Use `.obs` for observable variables (e.g., `final count = 0.obs;`).
|
|
35
|
+
- Wrap UI in `Obx(() => ...)` to listen for changes.
|
|
36
|
+
- For simple state, use `update()` in controller and `GetBuilder` in UI.
|
|
37
|
+
- **Dependency Injection**:
|
|
38
|
+
- **Bindings**: Use `Bindings` class to decouple DI from UI.
|
|
39
|
+
- **Lazy Load**: Prefer `Get.lazyPut(() => Controller())` in Bindings.
|
|
40
|
+
- **Lifecycle**: Let GetX handle disposal. Avoid `permanent: true`.
|
|
41
|
+
- **Hooks**: Use `onInit()`, `onReady()`, `onClose()` instead of `initState`/`dispose`.
|
|
42
|
+
- **Architecture**: Use `get_cli` for modular MVVM (data, models, modules).
|
|
43
|
+
|
|
44
|
+
## Anti-Patterns
|
|
45
|
+
|
|
46
|
+
- **Ctx in Logic**: Pass no `BuildContext` to controllers.
|
|
47
|
+
- **Inline DI**: Avoid `Get.put()` in widgets; use Bindings + `Get.find`.
|
|
48
|
+
- **Fat Views**: Keep views pure UI; delegate all logic to controller.
|
|
49
|
+
|
|
50
|
+
## Code Example
|
|
51
|
+
|
|
52
|
+
```dart
|
|
53
|
+
class UserController extends GetxController {
|
|
54
|
+
final name = "User".obs;
|
|
55
|
+
void updateName(String val) => name.value = val;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
class UserView extends GetView<UserController> {
|
|
59
|
+
@override
|
|
60
|
+
Widget build(ctx) => Scaffold(
|
|
61
|
+
body: Obx(() => Text(controller.name.value)),
|
|
62
|
+
floatingActionButton: FloatingActionButton(
|
|
63
|
+
onPressed: () => controller.updateName("New"),
|
|
64
|
+
),
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Reference & Examples
|
|
70
|
+
|
|
71
|
+
For DI Bindings and Reactive patterns:
|
|
72
|
+
See [references/binding-example.md](references/binding-example.md) and [references/reactive-vs-simple.md](references/reactive-vs-simple.md).
|
|
73
|
+
|
|
74
|
+
## Related Topics
|
|
75
|
+
|
|
76
|
+
getx-navigation | feature-based-clean-architecture | dependency-injection
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# GetX Binding Example
|
|
2
|
+
|
|
3
|
+
Using Bindings ensures that dependencies are only in memory when the associated route is active.
|
|
4
|
+
|
|
5
|
+
```dart
|
|
6
|
+
// 1. Define the Binding
|
|
7
|
+
class HomeBinding extends Bindings {
|
|
8
|
+
@override
|
|
9
|
+
void dependencies() {
|
|
10
|
+
// lazyPut only initializes the controller when it's first used (Get.find)
|
|
11
|
+
Get.lazyPut<HomeController>(() => HomeController());
|
|
12
|
+
Get.lazyPut<HomeRepository>(() => HomeRepositoryImpl());
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// 2. Attach to Route
|
|
17
|
+
GetPage(
|
|
18
|
+
name: '/home',
|
|
19
|
+
page: () => HomeView(),
|
|
20
|
+
binding: HomeBinding(),
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
// 3. Use in View via GetView (automatically finds the controller)
|
|
24
|
+
class HomeView extends GetView<HomeController> {
|
|
25
|
+
@override
|
|
26
|
+
Widget build(BuildContext context) {
|
|
27
|
+
return Scaffold(
|
|
28
|
+
body: Obx(() => Text(controller.title.value)),
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
```
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Reactive vs. Simple State Management
|
|
2
|
+
|
|
3
|
+
GetX provides two ways to manage state. Choose based on complexity and performance needs.
|
|
4
|
+
|
|
5
|
+
## 1. Reactive (.obs + Obx)
|
|
6
|
+
|
|
7
|
+
Best for: Highly interactive UIs, streams, and granular updates.
|
|
8
|
+
|
|
9
|
+
```dart
|
|
10
|
+
class UserController extends GetxController {
|
|
11
|
+
final name = "Guest".obs;
|
|
12
|
+
final age = 18.obs;
|
|
13
|
+
|
|
14
|
+
void updateName(String newName) => name.value = newName;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// UI
|
|
18
|
+
Obx(() => Text(controller.name.value));
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### 2. Simple state management
|
|
22
|
+
|
|
23
|
+
Best for: Large objects, low-frequency updates, or reducing memory overhead of many streams.
|
|
24
|
+
|
|
25
|
+
```dart
|
|
26
|
+
class UserController extends GetxController {
|
|
27
|
+
String name = "Guest";
|
|
28
|
+
|
|
29
|
+
void updateName(String newName) {
|
|
30
|
+
name = newName;
|
|
31
|
+
update(); // Manually notify listeners
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// UI
|
|
36
|
+
GetBuilder<UserController>(
|
|
37
|
+
builder: (controller) => Text(controller.name),
|
|
38
|
+
);
|
|
39
|
+
```
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Flutter GoRouter Navigation
|
|
3
|
+
description: Typed routes, route state, and redirection using go_router.
|
|
4
|
+
metadata:
|
|
5
|
+
labels: [navigation, go-router, routing]
|
|
6
|
+
triggers:
|
|
7
|
+
files: ['**/router.dart', '**/app_router.dart']
|
|
8
|
+
keywords: [GoRouter, GoRoute, StatefulShellRoute, redirection, typed-routes]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# GoRouter Navigation
|
|
12
|
+
|
|
13
|
+
## **Priority: P0 (CRITICAL)**
|
|
14
|
+
|
|
15
|
+
Type-safe deep linking and routing system using `go_router` and `go_router_builder`.
|
|
16
|
+
|
|
17
|
+
## Structure
|
|
18
|
+
|
|
19
|
+
```text
|
|
20
|
+
core/router/
|
|
21
|
+
├── app_router.dart # Router configuration
|
|
22
|
+
└── routes.dart # Typed route definitions (GoRouteData)
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Implementation Guidelines
|
|
26
|
+
|
|
27
|
+
- **Typed Routes**: Always use `GoRouteData` from `go_router_builder`. Never use raw path strings.
|
|
28
|
+
- **Root Router**: One global `GoRouter` instance registered in DI.
|
|
29
|
+
- **Sub-Routes**: Nest related routes using `TypedGoRoute` and children lists.
|
|
30
|
+
- **Redirection**: Handle Auth (Login check) in the `redirect` property of the `GoRouter` config.
|
|
31
|
+
- **Parameters**: Use `@TypedGoRoute` to define paths with `:id` parameters.
|
|
32
|
+
- **Transitions**: Define standard transitions (Fade, Slide) in `buildPage`.
|
|
33
|
+
- **Navigation**: Use `MyRoute().go(context)` or `MyRoute().push(context)`.
|
|
34
|
+
|
|
35
|
+
## Code
|
|
36
|
+
|
|
37
|
+
```dart
|
|
38
|
+
// Route Definition
|
|
39
|
+
@TypedGoRoute<HomeRoute>(path: '/')
|
|
40
|
+
class HomeRoute extends GoRouteData {
|
|
41
|
+
@override
|
|
42
|
+
Widget build(context, state) => const HomePage();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Router Config
|
|
46
|
+
final router = GoRouter(
|
|
47
|
+
routes: $appRoutes,
|
|
48
|
+
redirect: (context, state) {
|
|
49
|
+
if (notAuthenticated) return '/login';
|
|
50
|
+
return null;
|
|
51
|
+
},
|
|
52
|
+
);
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Related Topics
|
|
56
|
+
|
|
57
|
+
layer-based-clean-architecture | auto-route-navigation | security
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Idiomatic Flutter
|
|
3
|
+
description: Modern layout and widget composition standards.
|
|
4
|
+
metadata:
|
|
5
|
+
labels: [flutter, clean-code, widgets]
|
|
6
|
+
triggers:
|
|
7
|
+
files: ['lib/presentation/**/*.dart']
|
|
8
|
+
keywords: [context.mounted, SizedBox, Gap, composition, shrink]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Idiomatic Flutter (P1)
|
|
12
|
+
|
|
13
|
+
- **Async Gaps**: Check `if (context.mounted)` before using `BuildContext` after `await`.
|
|
14
|
+
- **Composition**: Extract complex UI into small widgets. Avoid deep nesting or large helper methods.
|
|
15
|
+
- **Layout**:
|
|
16
|
+
- Spacing: Use `Gap(n)` or `SizedBox` over `Padding` for simple gaps.
|
|
17
|
+
- Empty UI: Use `const SizedBox.shrink()`.
|
|
18
|
+
- Intrinsic: Avoid `IntrinsicWidth/Height`; use `Stack` + `FractionallySizedBox` for overlays.
|
|
19
|
+
- **Optimization**: Use `ColoredBox`/`Padding`/`DecoratedBox` instead of `Container` when possible.
|
|
20
|
+
- **Themes**: Use extensions for `Theme.of(context)` access.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Flutter Layer-based Clean Architecture + DDD
|
|
3
|
+
description: Standards for separation of concerns, layer dependency rules, and DDD in Flutter.
|
|
4
|
+
metadata:
|
|
5
|
+
labels: [architecture, clean-architecture, layers, ddd]
|
|
6
|
+
triggers:
|
|
7
|
+
files: ['lib/domain/**', 'lib/infrastructure/**', 'lib/application/**']
|
|
8
|
+
keywords: [domain, infrastructure, application, presentation, layers, dto, mapper]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Layer-Based Clean Architecture
|
|
12
|
+
|
|
13
|
+
## **Priority: P0 (CRITICAL)**
|
|
14
|
+
|
|
15
|
+
Standardized separation of concerns and dependency flow using DDD principles.
|
|
16
|
+
|
|
17
|
+
## Structure
|
|
18
|
+
|
|
19
|
+
```text
|
|
20
|
+
lib/
|
|
21
|
+
├── domain/ # Pure Dart: entities (@freezed), failures, repository interfaces
|
|
22
|
+
├── infrastructure/ # Implementation: DTOs, data sources, mappers, repo impls
|
|
23
|
+
├── application/ # Orchestration: BLoCs / Cubits
|
|
24
|
+
└── presentation/ # UI: Screens, reusable components
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Implementation Guidelines
|
|
28
|
+
|
|
29
|
+
- **Dependency Flow**: `Presentation -> Application -> Domain <- Infrastructure`. Dependencies point inward.
|
|
30
|
+
- **Pure Domain**: No Flutter (Material/Store) or Infrastructure (Dio/Hive) dependencies in `Domain`.
|
|
31
|
+
- **Functional Error Handling**: Repositories must return `Either<Failure, Success>`.
|
|
32
|
+
- **Always Map**: Infrastructure must map DTOs to Domain Entities; do not leak DTOs to UI.
|
|
33
|
+
- **Immutability**: Use `@freezed` for all entities and failures.
|
|
34
|
+
- **Logic Placement**: No business logic in UI; widgets only display state and emit events.
|
|
35
|
+
- **Inversion of Control**: Use `get_it` to inject repository implementations into BLoCs.
|
|
36
|
+
|
|
37
|
+
## Anti-Patterns
|
|
38
|
+
|
|
39
|
+
- **No DTOs in UI**: Never import a `.g.dart` or Data class directly in a Widget.
|
|
40
|
+
- **No Material in Domain**: Do not import `package:flutter/material.dart` in the `domain` layer.
|
|
41
|
+
- **No Shared Prefs in Repo**: Do not use `shared_preferences` directly in a Repository; use a Data Source.
|
|
42
|
+
|
|
43
|
+
## Reference & Examples
|
|
44
|
+
|
|
45
|
+
For full implementation templates and DTO-to-Domain mapping examples:
|
|
46
|
+
See [references/REFERENCE.md](references/REFERENCE.md).
|
|
47
|
+
|
|
48
|
+
## Related Topics
|
|
49
|
+
|
|
50
|
+
feature-based-clean-architecture | bloc-state-management | dependency-injection | error-handling
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Reference: Layer-based Clean Architecture Examples
|
|
2
|
+
|
|
3
|
+
## **Full Layer Implementation**
|
|
4
|
+
|
|
5
|
+
### 1. Domain Layer (Entity)
|
|
6
|
+
|
|
7
|
+
```dart
|
|
8
|
+
@freezed
|
|
9
|
+
class Bank with _$Bank {
|
|
10
|
+
const factory Bank({
|
|
11
|
+
required String id,
|
|
12
|
+
required String name,
|
|
13
|
+
required String branchCode,
|
|
14
|
+
}) = _Bank;
|
|
15
|
+
|
|
16
|
+
factory Bank.fromJson(Map<String, dynamic> json) => _$BankFromJson(json);
|
|
17
|
+
}
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
### 2. Infrastructure Layer (DTO & Mapper)
|
|
21
|
+
|
|
22
|
+
```dart
|
|
23
|
+
@freezed
|
|
24
|
+
class BankDto with _$BankDto {
|
|
25
|
+
const factory BankDto({
|
|
26
|
+
@JsonKey(name: 'bank_id') required String id,
|
|
27
|
+
@JsonKey(name: 'bank_name') required String name,
|
|
28
|
+
@JsonKey(name: 'code') required String branchCode,
|
|
29
|
+
}) = _BankDto;
|
|
30
|
+
|
|
31
|
+
factory BankDto.fromJson(Map<String, dynamic> json) => _$BankDtoFromJson(json);
|
|
32
|
+
|
|
33
|
+
Bank toDomain() => Bank(
|
|
34
|
+
id: id,
|
|
35
|
+
name: name,
|
|
36
|
+
branchCode: branchCode,
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### 3. Application Layer (BLoC)
|
|
42
|
+
|
|
43
|
+
```dart
|
|
44
|
+
class BankBloc extends Bloc<BankEvent, BankState> {
|
|
45
|
+
final IBankRepository repository;
|
|
46
|
+
|
|
47
|
+
BankBloc(this.repository) : super(const BankState.initial()) {
|
|
48
|
+
on<_Fetch>(_onFetch);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
Future<void> _onFetch(_Fetch event, Emitter<BankState> emit) async {
|
|
52
|
+
emit(const BankState.loading());
|
|
53
|
+
final failureOrBanks = await repository.fetchBanks();
|
|
54
|
+
emit(failureOrBanks.fold(
|
|
55
|
+
(f) => BankState.error(f.message),
|
|
56
|
+
(banks) => BankState.loaded(banks),
|
|
57
|
+
));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
```
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Repositories & DTO Mapping Reference
|
|
2
|
+
|
|
3
|
+
## **Data Transfer Object (DTO)**
|
|
4
|
+
|
|
5
|
+
DTOs live in the **Infrastructure** layer and represent the raw JSON response.
|
|
6
|
+
|
|
7
|
+
```dart
|
|
8
|
+
@freezed
|
|
9
|
+
class BankDto with _$BankDto {
|
|
10
|
+
const BankDto._();
|
|
11
|
+
|
|
12
|
+
const factory BankDto({
|
|
13
|
+
@JsonKey(name: 'bank_id') required String id,
|
|
14
|
+
@JsonKey(name: 'bank_name') required String name,
|
|
15
|
+
@JsonKey(name: 'code') required String branchCode,
|
|
16
|
+
}) = _BankDto;
|
|
17
|
+
|
|
18
|
+
factory BankDto.fromJson(Map<String, dynamic> json) => _$BankDtoFromJson(json);
|
|
19
|
+
|
|
20
|
+
// Mapping to Domain Entity
|
|
21
|
+
Bank toDomain() => Bank(
|
|
22
|
+
id: id,
|
|
23
|
+
name: name,
|
|
24
|
+
branchCode: branchCode,
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## **Repository Implementation**
|
|
30
|
+
|
|
31
|
+
The implementation handles the actual data fetching (Remote/Local) and mapping.
|
|
32
|
+
|
|
33
|
+
```dart
|
|
34
|
+
class BankRepository implements IBankRepository {
|
|
35
|
+
final BankRemoteDataSource remoteDataSource;
|
|
36
|
+
|
|
37
|
+
BankRepository(this.remoteDataSource);
|
|
38
|
+
|
|
39
|
+
@override
|
|
40
|
+
Future<Either<ApiFailure, List<Bank>>> fetchBanks() async {
|
|
41
|
+
try {
|
|
42
|
+
final dtoList = await remoteDataSource.getBanks();
|
|
43
|
+
// Perform the mapping here
|
|
44
|
+
return right(dtoList.map((dto) => dto.toDomain()).toList());
|
|
45
|
+
} catch (e) {
|
|
46
|
+
return left(ApiFailure.fromException(e));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
```
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Flutter Localization
|
|
3
|
+
description: Standards for multi-language support using easy_localization and JSON/CSV assets.
|
|
4
|
+
metadata:
|
|
5
|
+
labels: [localization, l10n, i18n, easy_localization]
|
|
6
|
+
triggers:
|
|
7
|
+
files: ['**/assets/translations/*.json', 'main.dart']
|
|
8
|
+
keywords:
|
|
9
|
+
[localization, multi-language, translation, tr(), easy_localization]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Localization
|
|
13
|
+
|
|
14
|
+
## **Priority: P1 (STANDARD)**
|
|
15
|
+
|
|
16
|
+
Consistent multi-language support using `easy_localization`.
|
|
17
|
+
|
|
18
|
+
## Structure
|
|
19
|
+
|
|
20
|
+
```text
|
|
21
|
+
assets/
|
|
22
|
+
└── translations/
|
|
23
|
+
├── en.json
|
|
24
|
+
└── vi.json
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Implementation Guidelines
|
|
28
|
+
|
|
29
|
+
- **Bootstrap**: Wrap root with `EasyLocalization`. Always use `await EasyLocalization.ensureInitialized()`.
|
|
30
|
+
- **Format**: Default to JSON. Store in `assets/translations/`.
|
|
31
|
+
- **Lookup**: Use `.tr()` extension on strings.
|
|
32
|
+
- **Locale**: Change via `context.setLocale(Locale('code'))`.
|
|
33
|
+
- **Params**: Use `{}` in JSON; pass via `tr(args: [...])`.
|
|
34
|
+
- **Counting**: Use `plural()` for quantities.
|
|
35
|
+
- **Sheets**: Sync via `sheet_loader_localization` from Google Sheets for Online file storage to JSON/CSV.
|
|
36
|
+
|
|
37
|
+
## Anti-Patterns
|
|
38
|
+
|
|
39
|
+
- **Hardcoding**: No raw strings in UI; use keys.
|
|
40
|
+
- **Manual L10n**: Avoid standard `Localizations.of`; use GetX or `easy_localization` context methods.
|
|
41
|
+
- **Desync**: Keep keys identical across all locale files.
|
|
42
|
+
|
|
43
|
+
## Reference & Examples
|
|
44
|
+
|
|
45
|
+
For setup and Google Sheets automation:
|
|
46
|
+
See [references/REFERENCE.md](references/REFERENCE.md).
|
|
47
|
+
|
|
48
|
+
## Related Topics
|
|
49
|
+
|
|
50
|
+
idiomatic-flutter | widgets
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Localization Reference
|
|
2
|
+
|
|
3
|
+
## Easy Localization Setup
|
|
4
|
+
|
|
5
|
+
Basic implementation in `main.dart`.
|
|
6
|
+
|
|
7
|
+
```dart
|
|
8
|
+
Future<void> main() async {
|
|
9
|
+
WidgetsFlutterBinding.ensureInitialized();
|
|
10
|
+
await EasyLocalization.ensureInitialized();
|
|
11
|
+
|
|
12
|
+
runApp(
|
|
13
|
+
EasyLocalization(
|
|
14
|
+
supportedLocales: const [Locale('en'), Locale('vi')],
|
|
15
|
+
path: 'assets/translations', // <-- Path to translations
|
|
16
|
+
fallbackLocale: const Locale('en'),
|
|
17
|
+
child: const MyApp(),
|
|
18
|
+
),
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## JSON Translation Format
|
|
24
|
+
|
|
25
|
+
Default format for project assets.
|
|
26
|
+
|
|
27
|
+
```json
|
|
28
|
+
// en.json
|
|
29
|
+
{
|
|
30
|
+
"app_title": "My App",
|
|
31
|
+
"welcome": "Welcome, {}!",
|
|
32
|
+
"items_count": {
|
|
33
|
+
"zero": "No items",
|
|
34
|
+
"one": "{} item",
|
|
35
|
+
"other": "{} items"
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Google Sheets Integration
|
|
41
|
+
|
|
42
|
+
Use `sheet_loader_localization` to fetch and generate localizations from Google Sheets.
|
|
43
|
+
|
|
44
|
+
1. Add to `pubspec.yaml` under `dev_dependencies`.
|
|
45
|
+
2. Configure sheets URL/ID in `pubspec.yaml` or separate config.
|
|
46
|
+
3. Run `flutter pub run sheet_loader_localization:main`.
|
|
47
|
+
|
|
48
|
+
See [Sheet Loader Example](sheet-loader.md).
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Google Sheets Localization Loader
|
|
2
|
+
|
|
3
|
+
Automating translation updates from Google Sheets using `sheet_loader_localization`.
|
|
4
|
+
|
|
5
|
+
## Configuration (`pubspec.yaml`)
|
|
6
|
+
|
|
7
|
+
```yaml
|
|
8
|
+
dev_dependencies:
|
|
9
|
+
sheet_loader_localization: ^0.1.0
|
|
10
|
+
|
|
11
|
+
sheet_loader_localization:
|
|
12
|
+
# Google Sheet ID (find in the URL of your sheet)
|
|
13
|
+
doc_id: 'your_google_sheet_id_here'
|
|
14
|
+
sheet_id: '0' # Usually 0 for first sheet
|
|
15
|
+
output_path: 'assets/translations'
|
|
16
|
+
output_format: 'json' # Can be csv or json
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Typical Sheet Format ([example sheet](https://docs.google.com/spreadsheets/d/1v2Y3e0Uvn0JTwHvsduNT70u7Fy9TG43DIcZYJxPu1ZA/edit?gid=1013756643#gid=1013756643))
|
|
20
|
+
|
|
21
|
+
| key | en | vi |
|
|
22
|
+
| :------------- | :------------ | :--------- |
|
|
23
|
+
| welcome | Welcome! | Chào mừng! |
|
|
24
|
+
| login.button | Login | Đăng nhập |
|
|
25
|
+
| errors.network | Network Error | Lỗi mạng |
|
|
26
|
+
|
|
27
|
+
## CLI Command
|
|
28
|
+
|
|
29
|
+
Run this command to synchronize your local asset files with the Google Sheet:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
flutter pub run sheet_loader_localization:main
|
|
33
|
+
```
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Flutter Navigator v1 (Imperative)
|
|
3
|
+
description: Standard Flutter navigation using Navigator 1.0 (push/pop).
|
|
4
|
+
metadata:
|
|
5
|
+
labels: [navigation, navigator, flutter-core]
|
|
6
|
+
triggers:
|
|
7
|
+
files: ['**/app.dart']
|
|
8
|
+
keywords: [Navigator, push, pop, MaterialPageRoute, onGenerateRoute]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Navigator v1 Navigation
|
|
12
|
+
|
|
13
|
+
## **Priority: P0 (CRITICAL)**
|
|
14
|
+
|
|
15
|
+
Standard imperative navigation system built into Flutter using `Navigator` and `MaterialPageRoute`.
|
|
16
|
+
|
|
17
|
+
## Implementation Guidelines
|
|
18
|
+
|
|
19
|
+
- **Standard Push**: Use `Navigator.of(context).push(MaterialPageRoute(builder: (_) => Screen()))`.
|
|
20
|
+
- **Named Routes**: Define `routes` map in `MaterialApp` or use `onGenerateRoute` for dynamic routing.
|
|
21
|
+
- **Passing Arguments**:
|
|
22
|
+
- For named routes: Use `Navigator.pushNamed(context, '/path', arguments: data)`.
|
|
23
|
+
- For `onGenerateRoute`: Extract arguments using `settings.arguments`.
|
|
24
|
+
- **Returning Data**: `final result = await Navigator.push(...)` and `Navigator.pop(context, data)`.
|
|
25
|
+
- **Replacing Screens**: Use `pushReplacement` or `pushAndRemoveUntil` for auth/splash flows.
|
|
26
|
+
|
|
27
|
+
## Code Example
|
|
28
|
+
|
|
29
|
+
```dart
|
|
30
|
+
// Basic Push
|
|
31
|
+
Navigator.push(
|
|
32
|
+
context,
|
|
33
|
+
MaterialPageRoute(builder: (context) => const DetailScreen()),
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
// Named Routes Configuration
|
|
37
|
+
MaterialApp(
|
|
38
|
+
initialRoute: '/',
|
|
39
|
+
onGenerateRoute: (settings) {
|
|
40
|
+
if (settings.name == '/details') {
|
|
41
|
+
final args = settings.arguments as Map;
|
|
42
|
+
return MaterialPageRoute(
|
|
43
|
+
builder: (context) => DetailScreen(id: args['id']),
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
return null;
|
|
47
|
+
},
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
// Navigation with Arguments
|
|
51
|
+
Navigator.pushNamed(
|
|
52
|
+
context,
|
|
53
|
+
'/details',
|
|
54
|
+
arguments: {'id': 123},
|
|
55
|
+
);
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Anti-Patterns
|
|
59
|
+
|
|
60
|
+
- **Deep Nesting**: Avoid anonymous routes for complex apps; use `onGenerateRoute`.
|
|
61
|
+
- **Manual String Paths**: Always use constants for route names.
|
|
62
|
+
- **Context Leaks**: Ensure `BuildContext` is valid when calling `Navigator.of(context)`. Use `ScaffoldMessenger` or global keys if navigation is needed outside `build`.
|
|
63
|
+
|
|
64
|
+
## Reference & Examples
|
|
65
|
+
|
|
66
|
+
For centralized `onGenerateRoute` implementation:
|
|
67
|
+
See [references/on-generate-route.md](references/on-generate-route.md).
|
|
68
|
+
|
|
69
|
+
## Related Topics
|
|
70
|
+
|
|
71
|
+
idiomatic-flutter | widgets
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Navigator v1: Centralized onGenerateRoute
|
|
2
|
+
|
|
3
|
+
Using an abstract class for route names and a centralized router for navigation logic.
|
|
4
|
+
|
|
5
|
+
```dart
|
|
6
|
+
// route_names.dart
|
|
7
|
+
abstract class Routes {
|
|
8
|
+
static const home = '/';
|
|
9
|
+
static const details = '/details';
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// app_router.dart
|
|
13
|
+
class AppRouter {
|
|
14
|
+
static Route<dynamic> onGenerateRoute(RouteSettings settings) {
|
|
15
|
+
switch (settings.name) {
|
|
16
|
+
case Routes.home:
|
|
17
|
+
return MaterialPageRoute(builder: (_) => const HomeScreen());
|
|
18
|
+
|
|
19
|
+
case Routes.details:
|
|
20
|
+
// Safe argument extraction
|
|
21
|
+
final args = settings.arguments;
|
|
22
|
+
if (args is int) {
|
|
23
|
+
return MaterialPageRoute(
|
|
24
|
+
builder: (_) => DetailScreen(id: args),
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
return _errorRoute();
|
|
28
|
+
|
|
29
|
+
default:
|
|
30
|
+
return _errorRoute();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
static Route<dynamic> _errorRoute() {
|
|
35
|
+
return MaterialPageRoute(
|
|
36
|
+
builder: (_) => const Scaffold(body: Center(child: Text('Error'))),
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// main.dart
|
|
42
|
+
MaterialApp(
|
|
43
|
+
onGenerateRoute: AppRouter.onGenerateRoute,
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
// Usage
|
|
47
|
+
Navigator.pushNamed(context, Routes.details, arguments: 42);
|
|
48
|
+
```
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Flutter Performance
|
|
3
|
+
description: Optimization standards for rebuilds and memory.
|
|
4
|
+
metadata:
|
|
5
|
+
labels: [performance]
|
|
6
|
+
triggers:
|
|
7
|
+
files: ['lib/presentation/**', 'pubspec.yaml']
|
|
8
|
+
keywords: [const, buildWhen, ListView.builder, Isolate, RepaintBoundary]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Performance (P1)
|
|
12
|
+
|
|
13
|
+
- **Rebuilds**: Use `const` widgets and `buildWhen` / `select` for granular updates.
|
|
14
|
+
- **Lists**: Always use `ListView.builder` for item recycling.
|
|
15
|
+
- **Heavy Tasks**: Use `compute()` or `Isolates` for parsing/logic.
|
|
16
|
+
- **Repaints**: Use `RepaintBoundary` for complex animations. Use `debugRepaintRainbowEnabled` to debug.
|
|
17
|
+
- **Images**: Use `CachedNetworkImage` + `memCacheWidth`. `precachePicture` for SVGs.
|
|
18
|
+
|
|
19
|
+
```dart
|
|
20
|
+
BlocBuilder<UserBloc, UserState>(
|
|
21
|
+
buildWhen: (p, c) => p.id != c.id,
|
|
22
|
+
builder: (context, state) => Text(state.name),
|
|
23
|
+
)
|
|
24
|
+
```
|