在颤振中通过路由传递数据时检测到 null 类型的值

Posted

技术标签:

【中文标题】在颤振中通过路由传递数据时检测到 null 类型的值【英文标题】:Value detected of type null when passing data via routes in flutter 【发布时间】:2022-01-20 20:29:29 【问题描述】:

这个错误只是在数据从加载屏幕成功传递之前的一段时间。

传递数据的加载界面:

如果我在这里打印实例,则不会出现错误

void setupWorldTime() async 
    WorldTime instance = WorldTime(location: 'Jawa Timur', flag: 'jakarta.png', url: 'Asia/Jakarta');
    await instance.getTime();
    Navigator.pushReplacementNamed(context, '/home', arguments: 
      'location': instance.location,
      'flag': instance.flag,
      'time': instance.time,
    );
  

正在接收数据的主屏幕:

Map data = ;
  
  @override
  Widget build(BuildContext context) 

    data = ModalRoute.of(context)!.settings.arguments as Map;
    print(data['location']);

    return Scaffold(
      body: SafeArea(
        child: Padding(
          padding: const EdgeInsets.only(top: 50),
          child: Column(
            children: [
              TextButton.icon(
                onPressed: () 
                  Navigator.pushNamed(context, '/location');
                ,
                icon: const Icon(Icons.edit_location),
                label: const Text('Edit Location'),
              ),
              const SizedBox(
                height: 20,
              ),
              Row(mainAxisAlignment: MainAxisAlignment.center, children: [
                Text(
                  data['time'],
                  style: const TextStyle(
                    fontSize: 30,
                  ),
                ),
              ]),
            ],
          ),
        ),
      ),
    );
  

打印(数据['位置']);完美地打印数据,但在它之前立即显示上面的错误,这是否意味着打印方法在接收值之前期望数据的值为空?如何解决它

【问题讨论】:

【参考方案1】:

您的方法setupWorldTime 是一个异步函数,在instance.getTime() 返回之前不会调用Navigator.pushReplacementNamed 位。因为您的主屏幕在没有设置参数的情况下启动,data = ModalRoute.of(context)!.settings.arguments as Map 会将数据设置为 null,从而导致您的错误。只有instance.getTime() 返回后,build() 才会再次被调用,这次是data != null,您的消息就会消失。

要解决此问题,您应该在 build 函数中测试 data == null 并在数据确实仍然为空时显示其他内容(如加载指示器),或者使用 FutureBuilder(首选)。

【讨论】:

谢谢,你拯救了我的一天!

以上是关于在颤振中通过路由传递数据时检测到 null 类型的值的主要内容,如果未能解决你的问题,请参考以下文章

将快照数据从一个 dart 文件传递​​到颤振项目中的另一个文件

在颤振中通过 Function(T) 传递泛型类型

无法通过颤振应用程序中的用户 ID 获取特定的用户文档

如何根据检测到颤振应用程序中的锁定或关闭屏幕采取行动

将文件上传到 S3 时如何传递 ACL 属性以进行颤振放大?

React Typescript - 在路由中传递时如何将类型添加到 location.state