DEV Community

Willane Paiva
Willane Paiva

Posted on

Flutter & Nuvigator: Intro com routers e parâmetros

Olá!

Este artigo tem como objetivo explicar um pouco sobre o nuvigator, construindo uma aplicação simples para mostrar como navegar de uma tela para outra e como enviar parâmetros.

O que é o nuvigator?

Nuvigator é um pacote flutter para navegação, feito em cima do flutter navigation. É um pacote que foi criado pelo Nubank e que tem como objetivo adicionar novas funcionalidades, como deep links, também tem suporte a rotas aninhadas e pode ajudar com aplicativos modulares. Confira aqui mais sobre o pacote

Exemplo

Para este exemplo, nós criaremos um app nuvigatorexample usando a cli do flutter:

flutter create nuvigatorexample

Instalando o pacote

A versão atual do nuvigator é 0.7.2, que não tem suporte ao null safety, e irá disparar um erro ao tentar rodar o app, então é necessário mudar a versão do sdk.

Dentro do arquivo pubspec.yaml, mude a versão do sdk:

sdk: ">=2.11.0 <3.0.0"

e adicione o nuvigator nas dependências:

dependencies: flutter: sdk: flutter nuvigator: 
Enter fullscreen mode Exit fullscreen mode

Agora instale o pacote, você pode usar sua IDE ou digitar o seguinte comando no terminal:

flutter pub get

Construindo o app

Vamos criar um exemplo usando nuvigator para navegar entre duas telas.

A primeira tela, Home, vai ter um botão que navega para a segunda tela, Details.

Nossa home_screen.dart:

import 'package:flutter/material.dart'; class HomeScreen extends StatelessWidget { final Function onPressed; const HomeScreen({Key key, this.onPressed}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('Home')), body: Center( child: ElevatedButton( onPressed: onPressed, child: const Text('Navigate to details'), )), ); } } 
Enter fullscreen mode Exit fullscreen mode

Nossa details_screen.dart:

import 'package:flutter/material.dart'; class DetailsScreen extends StatelessWidget { const DetailsScreen({Key key}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('Details')), body: const Center(child: Text('Details screen')), ); } } 
Enter fullscreen mode Exit fullscreen mode

Nosso main.dart:

import 'package:flutter/material.dart'; import 'package:nuvigator/next.dart'; import 'package:nuvigatorexample/screens/details_screen.dart'; import 'package:nuvigatorexample/screens/home_screen.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({Key key}) : super(key: key); // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: Nuvigator.routes(initialRoute: 'home', routes: [ NuRouteBuilder(path: 'home', builder: (BuildContext contextNuvigator, __, ___) => HomeScreen(onPressed: (){ Nuvigator.of(contextNuvigator).open('details'); },), screenType: materialScreenType), NuRouteBuilder( path: 'details', builder: (_, __, ___) => const DetailsScreen(), screenType: materialScreenType) ]), ); } } 
Enter fullscreen mode Exit fullscreen mode

Commit com essas mudanças

Gif mostrando uma tela com fundo branco, app bar azul com o texto 'home' e um botão escrito 'Navigate to details', então mostra uma segunda tela mostrando uma app bar com o titulo 'details' e um texto

Usando um router

Dentro da nossa home_screen, vamos adicionar uma nova classe que estende NuRoute:

import 'package:nuvigator/next.dart'; class HomeRouter extends NuRoute { @override Widget build(BuildContext context, NuRouteSettings<Object> settings) { return HomeScreen(onPressed: (){ nuvigator.pushNamed('details'); },); } @override String get path => 'home'; @override ScreenType get screenType => materialScreenType; } 
Enter fullscreen mode Exit fullscreen mode

Vamos fazer o mesmo para a details_screen:

import 'package:nuvigator/next.dart'; class DetailsRoute extends NuRoute { @override Widget build(BuildContext context, NuRouteSettings<Object> settings) { return DetailsScreen(); } @override String get path => 'details'; @override ScreenType get screenType => materialScreenType; } 
Enter fullscreen mode Exit fullscreen mode

Agora devemos criar nosso router dentro do main.dart, criando uma nova classe que estende NuRouter e mudando o MaterialApp home:

class Router extends NuRouter{ @override String get initialRoute => 'home'; @override List<NuRoute<NuRouter, Object, Object>> get registerRoutes => [ HomeRouter(), DetailsRoute() ]; } class MyApp extends StatelessWidget { const MyApp({Key key}) : super(key: key); @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: Nuvigator(router: Router()), ); } } 
Enter fullscreen mode Exit fullscreen mode

Isto deve ter o mesmo resultado que a navegação anterior.

Commit com as mudanças

Passando parâmetros para a tela de details

Agora, vamos enviar um texto personalizado para a tela details.

Primeiro, nos devemos definir um texto como parâmetro na função pushNamed:

nuvigator.pushNamed('details', arguments: {'message': 'Hello world'}); 
Enter fullscreen mode Exit fullscreen mode

Então, conseguimos recuperar este parâmetro dentro da tela details, usando os raw parameters do nuvigator settings.

Vamos recuperar a mensagem dentro do método build do DetailsRoute:

final String message = settings.rawParameters['message']; 
Enter fullscreen mode Exit fullscreen mode

E então dentro da nossa DetailsScreen, vamos adicionar uma nova prop chamada message e usar para renderizar a mensagem:

class DetailsScreen extends StatelessWidget { final String message; // text from route const DetailsScreen({Key key, this.message}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('Details')), body: Center(child: Text(message)), ); } } 
Enter fullscreen mode Exit fullscreen mode

Commit com as mudanças

Resultado:

Gif mostrando um app com a tela com uma app bar azul e um botão 'Navigate to details', e então uma segunda tela com o tela com o texto 'Hello World'

Top comments (0)