Passare dati tra schermate in Flutter con MaterialPageRoute e pushReplacement
Per passare dati da una schermata all'altra in Flutter, abbiamo sicuramente varie possibilità.
In questo articolo vediamo come farlo usando MaterialPageRoute e pushReplacement.
Cominciamo con una schermata dove ho un form; se i dati vengono validati, passerò la email scritta nella input text ad un'altra schermata:
import 'package:flutter/material.dart';
import 'home_screen.dart';
class LoginScreen extends StatefulWidget {
const LoginScreen({super.key});
@override
State<LoginScreen> createState() {
return _LoginState();
}
}
class _LoginState extends State<LoginScreen> {
final _formKey = GlobalKey<FormState>();
var _email = '';
var _password = '';
void _login() {
if (_formKey.currentState!.validate()) {
_formKey.currentState!.save();
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => const HomeScreen(),
settings: RouteSettings(
arguments: {'email': _email},
),
),
);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("Circoli Sportivi - Login"),
),
body: Center(
child: Card(
elevation: 50,
shadowColor: Colors.black,
child: SizedBox(
width: 700,
height: 500,
child: Padding(
padding: const EdgeInsets.all(20),
child: Form(
key: _formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const Text(
'Inserisci le credenziali che hai scelto in fase di registrazione',
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 20,
)),
const SizedBox(
height: 30,
),
TextFormField(
keyboardType: TextInputType.emailAddress,
decoration: const InputDecoration(
label: Text('Email'),
),
validator: (value) {
// TODO Controllo forma email
if (value == null ||
value.isEmpty ||
value.trim().isEmpty) {
return 'Inserire una email!';
}
return null;
},
onSaved: (value) {
_email = value!;
},
),
TextFormField(
obscureText: true,
decoration: const InputDecoration(
label: Text('Password'),
),
validator: (value) {
if (value == null ||
value.isEmpty ||
value.trim().isEmpty) {
return 'Inserire una password!';
}
return null;
},
onSaved: (value) {
_password = value!;
},
),
const SizedBox(
height: 30,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
ElevatedButton(
onPressed: _login,
child: const Text('Login'),
),
TextButton(
onPressed: () {},
child: const Text('Hai dimenticato la password?'),
),
],
),
],
),
),
),
),
),
),
);
}
}
Nella nostra HomeScreen avremo semplicemente questo:
import 'package:flutter/material.dart';
class HomeScreen extends StatelessWidget {
const HomeScreen({super.key});
static const routeName = '/home';
@override
Widget build(BuildContext context) {
final arguments = (ModalRoute.of(context)?.settings.arguments ??
<String, dynamic>{}) as Map;
final _email = arguments['email'];
return Scaffold(
appBar: AppBar(
title: const Text("Home"),
),
body: Center(
child: Text(_email),
),
);
}
}
Per completezza vi giro anche il main.dart:
import 'dart:core';
import 'package:flutter/material.dart';
import 'screens/home_screen.dart';
import 'screens/login_screen.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Circoli Sportivi',
theme: ThemeData(
primarySwatch: Colors.blue,
),
initialRoute: '/',
routes: {
'/': (ctx) => const LoginScreen(),
HomeScreen.routeName: (ctx) => const HomeScreen(),
},
onUnknownRoute: (settings) {
return MaterialPageRoute(
builder: (ctx) => const LoginScreen(),
);
},
);
}
}
Enjoy!
dart flutter materialpageroute pushreplacement
Commentami!