flutter - 传递和检索参数 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>'.
解决方案
错误提示意味着某些参数可能为空。因此您应该使用更安全的访问方法。以下代码可能会帮助您解决此问题。
final Map<String, dynamic> map = ModalRoute.of(context)?.settings?.arguments;
推荐阅读
- c# - 检测是否在 C# 中插入了 MySQL 行
- android - Android:程序类型已存在:com.google.zxing.BarcodeFormat
- python - 使用opencv检测网格的角
- amazon-web-services - 无法使用 ec2 + 应用程序负载均衡器获得 websocket 连接
- node.js - Babel 做了什么让我使用任何名称来导入导出函数的节点模块
- apache - apache 不工作,显示“404 page not found”错误
- cakephp - CakePHP 3 使用顺序对关联数据 DESC 进行排序
- javascript - NodeJs MYSQL 序列批量插入最佳实践
- reporting-services - SSRS 2016 找到第二个最小值/第二个最大值
- acumatica - 选择企业帐户后联系人选择器中的数据消失