You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 16:34:51