Pular para conteúdo

🧰 Extensions

O Modugo fornece um conjunto de extensions no BuildContext, GoRouterState e Uri que enriquecem a navegação, injeção e manipulação de rotas.


🔹 ContextNavigationExtension

Simplifica operações de navegação com GoRouter diretamente no BuildContext.

Métodos disponíveis

Método Descrição
go(location, {extra}) Navega para o caminho
goNamed(name, {pathParameters, queryParameters, extra, fragment}) Navega por nome
push(location, {extra}) Empilha uma nova rota
pushNamed(name, {pathParameters, queryParameters, extra}) Empilha por nome
pop([result]) Remove a rota atual da pilha
canPop() Verifica se pode voltar
canPush(location) Verifica se o caminho existe no router
replace(location, {extra}) Substitui a rota atual
pushReplacement(location, {extra}) Empilha substituindo a atual
replaceNamed(name, {pathParameters, queryParameters, extra}) Substitui por nome
pushReplacementNamed(name, {...}) Empilha substituindo por nome
reload() Recarrega a rota atual
replaceStack(paths) Substitui toda a pilha de navegação
goRouter Acessa a instância do GoRouter

Exemplos

// Navegação básica
context.go('/home');
context.push('/product/42');

// Navegação por nome
context.goNamed('product', pathParameters: {'id': '42'});
context.pushNamed('settings', queryParameters: {'tab': 'privacy'});

// Controle de pilha
if (context.canPop()) context.pop();

// Validação antes de navegar
if (context.canPush('/settings')) {
  context.go('/settings');
}

// Recarregar página atual
context.reload();

// Substituir toda a pilha
await context.replaceStack(['/home', '/profile', '/settings']);

🔹 ContextMatchExtension

Permite verificar rotas registradas, encontrar rotas correspondentes e extrair parâmetros.

Métodos disponíveis

Método Retorno Descrição
isKnownPath(path) bool Verifica se o path está registrado
isKnownRouteName(name) bool Verifica se o nome da rota existe
matchingRoute(location) GoRoute? Retorna a rota correspondente
matchParams(location) Map<String, String>? Extrai parâmetros do path
state GoRouterState Acessa o state atual do GoRouter

Exemplos

// Validação de rotas
final isValid = context.isKnownPath('/settings');
final isNamed = context.isKnownRouteName('profile');

// Encontrar rota correspondente
final route = context.matchingRoute('/user/42');
if (route != null) {
  debugPrint('Rota encontrada: ${route.name}');
}

// Extrair parâmetros
final params = context.matchParams('/user/42');
final userId = params?['id']; // '42'

🔹 ContextInjectionExtension

Acesso a dependências registradas no GetIt via BuildContext.

Métodos disponíveis

Método Retorno Descrição
read<T>({param1, param2, type, instanceName}) T Recupera dependência síncrona
readAsync<T>({param1, param2, type, instanceName}) Future<T> Recupera dependência assíncrona

Exemplos

// Acesso simples
final service = context.read<AuthService>();

// Instância nomeada
final db = context.read<Database>(instanceName: 'primary');

// Dependência assíncrona
final api = await context.readAsync<ApiClient>();

🔹 GoRouterStateExtension

Helpers para acessar dados do estado de navegação atual.

Propriedades e métodos

Membro Retorno Descrição
getExtra<T>() T? Extra passado na navegação, com cast
isCurrentRoute(name) bool Verifica se a rota atual tem o nome dado
effectivePath String Path do extra (se Map com 'path') ou uri.path
isInitialRoute bool true se matchedLocation == '/'
locationSegments List<String> Segmentos do path como lista
getPathParam(param) String? Valor de um parâmetro dinâmico do path
getStringQueryParam(key) String? Valor de query param como String
getIntQueryParam(key) int? Valor de query param como int
getBoolQueryParam(key) bool? Valor de query param como bool
argumentsOrThrow<T>() T Extra com cast obrigatório (throws se inválido)

Exemplos

// Extrair parâmetros
final id = state.getPathParam('id');
final page = state.getIntQueryParam('page');
final isActive = state.getBoolQueryParam('active');
final search = state.getStringQueryParam('q');

// Extras
final data = state.getExtra<MyModel>();
final required = state.argumentsOrThrow<MyModel>(); // throws se null

// Estado
if (state.isInitialRoute) {
  // Estamos na raiz
}

final segments = state.locationSegments;
// '/profile/settings' → ['profile', 'settings']

🔹 UriPathWithExtras

Extension no Uri com utilitários para manipulação de paths.

Métodos disponíveis

Método Retorno Descrição
fullPath String Path completo com query e fragment
hasQueryParam(key) bool Verifica se query param existe
getQueryParam(key, {defaultValue}) String? Valor do query param
isSubPathOf(other) bool Verifica se é sub-path de outro Uri
withAppendedPath(subPath) Uri Novo Uri com subpath concatenado

Exemplos

final uri = Uri.parse('/page?foo=1#section');

uri.fullPath;           // '/page?foo=1#section'
uri.hasQueryParam('foo'); // true
uri.getQueryParam('foo'); // '1'

final base = Uri.parse('/api');
uri.isSubPathOf(base);  // false

final extended = base.withAppendedPath('users');
// → Uri('/api/users')