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:
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'), )), ); } }
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')), ); } }
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) ]), ); } }
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; }
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; }
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()), ); } }
Isto deve ter o mesmo resultado que a navegação anterior.
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'});
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'];
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)), ); } }
Resultado:
Top comments (0)