Flutter带参数导航实现遇阻求助(使用StatefulWidget)
关于Flutter带参数页面导航的问题
我参照Flutter官方文档实现带参数的页面导航时遇到困难,怀疑是因为使用了StatefulWidget,而文档示例仅使用StatelessWidget。以下是相关代码:
main.dart
import 'dart:io'; import 'package:chope_ton_diplome/screens/PassArgumentsScreen.dart'; import 'package:chope_ton_diplome/screens/ScreenArguments.dart'; import 'package:flutter/material.dart'; import 'package:chope_ton_diplome/screens/Auth.dart'; import 'package:chope_ton_diplome/screens/Password.dart'; import 'package:chope_ton_diplome/screens/Term.dart'; import 'package:firebase_core/firebase_core.dart'; Future<void> main() async { WidgetsFlutterBinding.ensureInitialized(); Platform.isAndroid ? await Firebase.initializeApp( options: const FirebaseOptions( apiKey: "AIzaSyDqCXX9h8O4ieJPPCIeqCzs3UUarhDWWEk", appId: "1:150239692586:android:0a00b7f597f48794b5c053", messagingSenderId: "150239692586", projectId: "chopetonbts-16bc8", ), ) : await Firebase.initializeApp(); runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: 'Chope Ton BTS', debugShowCheckedModeBanner: false, initialRoute: "/", routes: { '/': (context) => const AuthScreen(), '/TermScreen': (context) => const TermScreen(email: '',), '/PasswordScreen': (context) => const PasswordScreen(), }, ); } }
PassArgumentsScreen.dart
import 'package:flutter/cupertino.dart'; class PassArgumentsScreen extends StatelessWidget { static const routeName = '/TermScreen'; final String email; const PassArgumentsScreen({ super.key, required this.email, }); @override Widget build(BuildContext context) { // TODO: implement build throw UnimplementedError(); } }
ScreenArguments.dart
class ScreenArguments { final String _email; ScreenArguments(this._email); }
Auth.dart
import 'package:chope_ton_diplome/screens/Guest.dart'; import 'package:chope_ton_diplome/screens/Password.dart'; import 'package:chope_ton_diplome/screens/Term.dart'; import 'package:chope_ton_diplome/screens/ScreenArguments.dart'; import 'package:chope_ton_diplome/screens/PassArgumentsScreen.dart'; import 'package:flutter/material.dart'; import 'PassArgumentsScreen.dart'; import 'ScreenArguments.dart'; class AuthScreen extends StatefulWidget { static const routeName = '/'; Function(int) onChangedStep(int i) { throw UnimplementedError(); } const AuthScreen({super.key, onChangedStep}); @override State<AuthScreen> createState() => _AuthScreenState(); } class _AuthScreenState extends State<AuthScreen> { final GlobalKey<FormState> _authKey = GlobalKey<FormState>(); final RegExp emailRegex = RegExp(r"[a-z0-9\.-]+@[a-z0-9\._-]+\.[a-z]+"); String email= ''; @override Widget build(BuildContext context) { final args = ModalRoute.of(context)!.settings.arguments as AuthScreen; return SafeArea( child: Scaffold( appBar: AppBar( title: Text(args.email), ), body: Center( child: SingleChildScrollView( padding: const EdgeInsets.symmetric(horizontal: 20.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ RichText( text: TextSpan( text: 'Bienvenue sur\n'.toUpperCase(), style: const TextStyle(color: Colors.black, fontSize: 30.0), children: [ TextSpan( text: 'ChopeTonDiplome'.toUpperCase(), style: TextStyle( color: Theme.of(context).primaryColor, fontWeight: FontWeight.bold, ), ), ], ), ), const Text( 'Esquive la case "Pôle emploi"', style: TextStyle( fontStyle: FontStyle.italic, ), ), const SizedBox( height: 50.0, ), Form( key: _authKey, child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ const Text('Entre ton email'), const SizedBox( height: 10.0, ), TextFormField( onChanged: (value) => setState(() => _email = value), validator: (value) => value!.isEmpty || !emailRegex.hasMatch(value) ? "Merci d'entrer une adresse email valide" : null, decoration: InputDecoration( hintText: 'Ex: john.walter@domaine.fr', border: OutlineInputBorder( borderRadius: BorderRadius.circular(0.0), borderSide: const BorderSide(color: Colors.grey), ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(0.0), borderSide: const BorderSide(color: Colors.grey), ), ), ), const SizedBox( height: 10.0, ), ElevatedButton( style: ElevatedButton.styleFrom( elevation: 0, backgroundColor: Theme.of(context).primaryColor, padding: const EdgeInsets.symmetric( vertical: 15.0, ), ), onPressed: !emailRegex.hasMatch(_email) ? null : () { if(_authKey.currentState!.validate()) { print(_email); Navigator.pushNamed(context, PassArgumentsScreen.routeName, arguments: ScreenArguments( _email, ), ); } }, child: Text( 'continue'.toUpperCase(), style: const TextStyle( color: Colors.white, ), ), ), ElevatedButton( style: ElevatedButton.styleFrom( elevation: 0, backgroundColor: Theme.of(context).primaryColor, padding: const EdgeInsets.symmetric( vertical: 15.0, ), ), onPressed: !emailRegex.hasMatch(_email) ? null : () { if(_authKey.currentState!.validate()) { print(_email); Navigator.pushNamed(context, TermScreen.routeName, arguments: ScreenArguments( _email, ), ); } }, child: Text( 'continue'.toUpperCase(), style: const TextStyle( color: Colors.white, ), ), ), ], ), ), ], ), ), ), ), ); } }
内容的提问来源于stack exchange,提问作者Fabien Lebourgeois
相关产品推荐
相关产品推荐

