首页 > 解决方案 > 传递和检索参数 Flutter - 错误:无法在“ModalRoute”上访问属性“设置”?因为它可能为空

问题描述

我可以知道下面的代码有什么问题吗?

我尝试将一些参数从登录屏幕发送到主屏幕,但我得到的只是错误:错误:无法在 'ModalRoute<Object?>?' 上访问属性 'settings' 因为它可能为空。

所以我的代码设计是,从我的 main.dart 调用 route_generator 保存所有路线 main.dart :

import 'package:flutter/material.dart';
import 'package:navigation/constants/app_color.dart';
import 'package:navigation/route_generator.dart';

void main() {
  runApp(MaterialApp(
    debugShowCheckedModeBanner: false,
    title: 'My Apps',
    theme: ThemeData(
      appBarTheme: AppBarTheme(
      color: Constant.buttonPrimaryColor,
    )),
    initialRoute: '/loginScreen',
    onGenerateRoute: RouteGenerator.generateRoute,
    ));
}

维护所有路线的 route_generator.dart :

import 'package:flutter/material.dart';
import 'package:navigation/screens/login_screen.dart';
import 'package:navigation/screens/home_screen.dart';
import 'package:navigation/screens/about_screen.dart';

class RouteGenerator {
  static Route<dynamic> generateRoute(RouteSettings settings) {
    switch (settings.name) {
      case '/loginScreen':
        return MaterialPageRoute (builder: (context) => LoginScreen());
      case '/homeScreen':
        return MaterialPageRoute (builder: (context) => HomeScreen()); 
      case '/aboutScreen':
        return MaterialPageRoute (builder: (context) => AboutScreen());
      default:
        return _errorRoute();
    }
  }

  static Route<dynamic> _errorRoute() {
    return MaterialPageRoute(builder: (context) {
      return Scaffold(
        appBar: AppBar(
          title: Text('ERROR'),
          centerTitle: true,
        ),
        body: Center(
          child: Text('Page not found!'),
        ),
      );
    });
  }
}

然后是一些基于API响应导航的services.dart(在这里发送参数),所以基本上我尝试从这个登录屏幕重定向到主屏幕,然后从这个登录屏幕我尝试将一些参数发送到主屏幕并尝试接收它并将其显示在屏幕上,在此处放置一些带有名称和电子邮件的虚拟数据:

if (response.statusCode == 201) {
    print('Response status code : ' + response.statusCode.toString());    
    print('response body : ' + response.body);
    Navigator.pushNamed(context, '/homeScreen', arguments: {
                 'name':'Johny',
                 'email':'johny@johny.com',
    });
      } else {
        print('Response status code : ' + response.statusCode.toString());      
        print('exception is : ' + response.body);
        throw Exception('Failed to login.');
      }

这是从颤振中引发错误的 home_screen.dart :

import 'package:flutter/material.dart';
import 'package:navigation/constants/app_color.dart';

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {

  @override
  Widget build(BuildContext context) {

  final Map<String, dynamic> map = ModalRoute.of(context).settings.arguments;

    return WillPopScope(
      onWillPop: () => Future.value(false),
      child: Scaffold(
        appBar: AppBar(
          automaticallyImplyLeading: false,
          title: Text("Home"),
        ),
        body: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              "Welcome to Apps",
              style: TextStyle(
                fontSize: 20,
              ),
            ),
            Text(
              "Hi, xxx",
              style: TextStyle(
                fontSize: 20,
              ),
            ),
            SizedBox(
              height: 10,
            ),
            Center(
              child: ElevatedButton(
                onPressed: () {
                  Navigator.pushNamed(context, '/aboutScreen');
                },
                child: Text(
                  "About",
                  style: TextStyle(
                    fontSize: 20,
                    fontWeight: FontWeight.bold
                  ),
                ),
                style: ButtonStyle(
                  backgroundColor: MaterialStateProperty.all(Constant.buttonPrimaryColor),
                  shape: MaterialStateProperty.all<RoundedRectangleBorder>(
                    RoundedRectangleBorder(
                      borderRadius: BorderRadius.circular(20),
                      side: BorderSide(color: Constant.buttonPrimaryColor)
                    )
                  )
                ),
              ),
            ),
            Center(
              child: ElevatedButton(
                onPressed: () {
                  Navigator.pop(context);
                },
                child: Text(
                  "Logout",
                  style: TextStyle(
                      fontSize: 20,
                      fontWeight: FontWeight.bold
                  ),
                ),
                style: ButtonStyle(
                  backgroundColor: MaterialStateProperty.all(Constant.buttonPrimaryColor),
                  shape: MaterialStateProperty.all<RoundedRectangleBorder>(
                    RoundedRectangleBorder(
                      borderRadius: BorderRadius.circular(20),
                      side: BorderSide(color: Constant.buttonPrimaryColor)
                    )
                  )
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

我尝试按照那里的一些教程进行操作,并且在 RouteGenerator 中我已经通过了 RouteSettings,尝试阅读了几次但仍然感到困惑,有人可以解释并告诉我如何传递和显示参数吗?

完整日志:

lib/screens/home_screen.dart:14:59: Error: Property 'settings' cannot be accessed on 
'ModalRoute<Object?>?' because it is potentially null.
 - 'ModalRoute' is from 'package:flutter/src/widgets/routes.dart' ('../flutter/packages/flutter/lib/src/widgets/routes.dart').
 - 'Object' is from 'dart:core'.
Try accessing using ?. instead.
  final Map<String, dynamic> map = ModalRoute.of(context).settings.arguments;
                                                          ^^^^^^^^
lib/screens/home_screen.dart:14:68: Error: A value of type 'Object?' can't be assigned to a variable of type 'Map<String, dynamic>'.

标签: flutterdartnavigationarguments

解决方案


错误提示意味着某些参数可能为空。因此您应该使用更安全的访问方法。以下代码可能会帮助您解决此问题。

  final Map<String, dynamic> map = ModalRoute.of(context)?.settings?.arguments;

推荐阅读