Flutter遇到的常见报错以及解决方案(持续更新)

news/2024/12/25 17:12:42/文章来源:https://www.cnblogs.com/linuxAndMcu/p/18630966

一、报错

Non-nullable instance field 'username' must be initialized.

报错代码:

class _FormDemoState extends State<FormDemo> {final registerFormKey = GlobalKey<FormState>();String username, password; // 这行报错...
}

解决方案参考:flutter2声明变量报错 Non-nullable instance field *** must be initialized._futter the non-nullable variable 'dperson' must be-CSDN博客

因 flutter2.0 添加了 Sound null safety 空安全声明,目的是通过显式声明可能为 null 的变量,增加 Dart 语言的鲁棒性。

因为 Dart 语言变量可以存 null 或者具体的值,因此在日常的开发中可能因为忘记赋值或者变量延迟赋值,导致访问某个变量时为 null,导致程序运行时抛出 exception。
这个功能推出后,可以从源码级解决 null 异常导致的错误。

有两种写法:

  • 在类型声明后添加 "?" 以标识这个变量是可以为 null 的。
  • 在类型声明前添加 "late" 以标识这个变量在使用前一定要进行初始化。

解决后的代码:

class _FormDemoState extends State<FormDemo> {final registerFormKey = GlobalKey<FormState>();late String username, password;...
}

A value of type 'String?' can't be assigned to a variable of type 'String'.

报错代码:

TextFormField(decoration:InputDecoration(icon: Icon(Icons.people), labelText: "用户名或手机号"),onSaved: (value) {this.username = value; // 这行报错},
),

解决方案参考:dart - 不能将 'String?' 类型的值分配给 'String' 类型的变量flutter - 堆栈溢出 (stackoverflow.com)

在 Flutter 的最新更新中,他们强制要求为所有变量提供非 null 值。因此,如果你有机会在 DropdownButton 的 onChanged 回调中遇到 null 值,你将收到如下错误消息:“无法将 'String?' 类型的值分配给 'String' 类型的变量。

要解决此问题,您只需添加 !运算符添加到 value 变量中,如下所示:

TextFormField(decoration:InputDecoration(icon: Icon(Icons.people), labelText: "用户名或手机号"),onSaved: (value) {this.username = value!; // 这行报错},
),

The method 'save' can't be unconditionally invoked because the receiver can be 'null'.

报错代码:

void registerForm() {registerFormKey.currentState.save(); // 这行报错print("username:$username password:$password");
}

解决方案:'showBottomSheet' can't be unconditionally invoked because the receiver can be ' - 掘金 (juejin.cn)

解决办法:向目标中添加一个空检查('!')。

解决后的代码:

void registerForm() {registerFormKey.currentState!.save();print("username:$username password:$password");
}

Target of URI doesn't exist: 'package:fluttertoast/fluttertoast.dart'.

报错解释:

这个错误表明你的代码中引用了一个不存在的文件或库,具体是 'package:fluttertoast/fluttertoast.dart'。这通常发生在你尝试使用一个未正确添加到项目的依赖包。

解决方法:

  • 确认是否已经将 fluttertoast 添加到了你的项目依赖中。如果没有,你需要将它添加到你的 pubspec.yaml 文件的依赖中。

  • 打开 pubspec.yaml 文件,然后添加以下行:

dependencies:flutter:sdk: flutterfluttertoast: ^8.0.8

然后运行 flutter pub get 命令来安装新的依赖。

Target of URI doesn't exist: 'package:flutter/material.dart'.

解决方案:【Flutter】报错Target of URI doesn‘t exist ‘package:flutter/material.dart‘_target of uri doesn't exist-CSDN博客

解决办法:更新依赖库。

在 Flutter 目录下,执行 cmd 命令,执行以下指令:

flutter packages get

报错:

Flutter assets will be downloaded from https://storage.flutter-io.cn. Make sure you trust this source!
Launching lib\main.dart on Windows in debug mode...
windows/flutter/CMakeLists.txt does not use FLUTTER_TARGET_PLATFORM, updating.
Error: Building with plugins requires symlink support.Please enable Developer Mode in your system settings. Runstart ms-settings:developers
to open settings.

原因:这个错误表示你的系统尚未启用开发者模式,所以无法使用 Flutter 的插件功能。
Flutter 插件会通过符号链接的方式与 Flutter 工程连接,所以需要启用开发者模式和符号链接支持。

解决方案:Flutter报错Building with plugins requires symlink support的解决方法_building with plugins requires symlink support. pl-CSDN博客


Failed to download canvaskit

在命令行中输入:export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn

以使用国内镜像,如设置成功会出现:

Flutter assets will be downloaded from https://storage.flutter-io.cn. Make sure you trust this source!

Flutter : Could not find a generator for route RouteSettings

报错:

Could not find a generator for route RouteSettings("XXX", null) in the _WidgetsAppState.

原因:是一个工程中多次使用 MaterialApp ,也就是说,您应该只使用一个 MaterialApp 作为树的根。

解决:需要删除子页面中 MaterialApp,并将其改为 Scaffold。


The parameter 'key' can't have a value of 'null' because of its type, but the implicit default value is 'null'.

还有另一个类似的报错:The parameter 'title' can't have a value of 'null' because of its type, but the implicit default value is 'null'.

报错:

class HomePage extends StatefulWidget {const HomePage({Key? key, this.title}) : super(key: key);// ......
}

原因:demo 的 flutter 版本过老,新的 flutter 版本升级对相关调用类构造方法添加了空判断导致。

解决办法:The parameter 'title' can't have a value of 'null' because of its type 'String', but the implicit... - 简书

根据报错提示进行调整。可以用Key ?key来表示可空,又因为 title 是 final 修饰量,final 修饰的常量必须在声明进初始化或者在构造函数中初始化,它的值可以动态计算。 所以可以添加 required 修饰要求必须作为参数填入。

const HomePage({Key? key, required this.title}) : super(key: key);

不报错了,但是会有警告:Convert 'key' to a super parameter. (Documentation)

解决办法:Flutter关于构造函数的简化写法 - 简书,程序改为:

const HomePage({super.key,required this.title,});

二、警告

Use key in widget constructors.

警告代码:

class MyApp extends StatelessWidget { // MyApp这里警告const MyApp({Key? key}) : super(key: key);@overrideWidget build(BuildContext context) {return MaterialApp(home: Scaffold(body: MyHomeBody(),),);}
}

原因:在组件的构造函数中没有使用 key

解决后的代码:

class MyApp extends StatelessWidget {const MyApp({super.key}); // 使用key@overrideWidget build(BuildContext context) {return MaterialApp(home: Scaffold(body: MyHomeBody(),),);}
}

Sort child properties last in widget instance creations.

警告代码:

class MyHomeBody extends StatelessWidget {const MyHomeBody({Key? key}) : super(key: key);@overrideWidget build(BuildContext context) {return Align(child: Icon(Icons.pets, size: 36, color: Colors.red), // 这行警告alignment: Alignment.bottomRight,widthFactor: 3,heightFactor: 3,);}
}

解决这个问题的方法是,在创建小部件时,确保子小部件作为最后一个参数传递,这样它们就会在属性列表的末尾。

解决后的代码:

class MyHomeBody extends StatelessWidget {const MyHomeBody({Key? key}) : super(key: key);@overrideWidget build(BuildContext context) {return Align(alignment: Alignment.bottomRight,widthFactor: 3,heightFactor: 3,      child: Icon(Icons.pets, size: 36, color: Colors.red), // child组件放到最后面);}
}

Avoid print` calls in production code.

警告代码:

class MyHomeBody extends StatelessWidget {......print("结束滚动....");......  
}

解决方案:

  • Flutter:避免在生产代码中调用“print” (360doc.com)
  • flutter - Avoid print calls in production code. (Documentation) - Stack Overflow

解决后的代码:

class MyHomeBody extends StatelessWidget {......debugPrint("结束滚动....");......  
}

Avoid using private types in public APIs.

警告代码:

class ScaffoldRoute extends StatefulWidget {const ScaffoldRoute({Key? key}) : super(key: key);@override_ScaffoldRouteState createState() => _ScaffoldRouteState(); // 这行报错
}class _ScaffoldRouteState extends State<ScaffoldRoute> {......
}

解决方案:

  • dart “避免在公共API中使用私有类型”Flutter中的警告 _大数据知识库 (saoniuhuo.com)

解决后的代码:

class ScaffoldRoute extends StatefulWidget {const ScaffoldRoute({Key? key}) : super(key: key);@overrideState<ScaffoldRoute> createState() => _ScaffoldRouteState();
}class _ScaffoldRouteState extends State<ScaffoldRoute> {......  
}

Prefer const literals as parameters of constructors on @immutable classes.

警告代码:

// 例子1
Expanded(child: ListView(children: <Widget>[ // 这行报警ListTile(leading: const Icon(Icons.add), // 这行报警title: const Text('Add account'), // 这行报警),ListTile(leading: const Icon(Icons.settings), // 这行报警title: const Text('Manage accounts'), // 这行报警),],),
),// 例子2
bottomNavigationBar: BottomNavigationBar(// 底部导航items: <BottomNavigationBarItem>[  // 这行报警BottomNavigationBarItem(icon: Icon(Icons.home), label: 'Home'),BottomNavigationBarItem(icon: Icon(Icons.business), label: 'Business'),BottomNavigationBarItem(icon: Icon(Icons.school), label: 'School'),],currentIndex: _selectedIndex,fixedColor: Colors.blue,onTap: _onItemTapped,
),

解决方案:前面加上 const 就可以了

解决后的代码:

// 例子1
Expanded(child: ListView(children: const <Widget>[ // 这里加上constListTile(leading: Icon(Icons.add),title: Text('Add account'),),ListTile(leading: Icon(Icons.settings),title: Text('Manage accounts'),),],),
),// 例子2
bottomNavigationBar: BottomNavigationBar(// 底部导航items: const <BottomNavigationBarItem>[ // 这里加上constBottomNavigationBarItem(icon: Icon(Icons.home), label: 'Home'),BottomNavigationBarItem(icon: Icon(Icons.business), label: 'Business'),BottomNavigationBarItem(icon: Icon(Icons.school), label: 'School'),],currentIndex: _selectedIndex,fixedColor: Colors.blue,onTap: _onItemTapped,
),

This class (or a class that this class inherits from) is marked as '@immutable', but one or more of its instance fields aren't final:

警告代码:

class Login extends StatelessWidget {var userNameController = TextEditingController();var passWordController = TextEditingController();//......
}  

解决方案:为了解决这个警告,你可以在声明实例字段时将其标记为 final。参考:flutter开发警告This class (or a class that this class inherits from) is marked as ‘@immutable‘, but one_flutter this class (or a class that this class inh-CSDN博客

解决后的代码:

class Login extends StatelessWidget {final userNameController = TextEditingController();final passWordController = TextEditingController();//......
} 

Convert 'key' to a super parameter.

const MyApp({Key? key}) : super(key: key); // 这句警告

解决方案参考:Flutter关于构造函数的简化写法 - 简书 (jianshu.com)

改成下面这样就可以了:

const MyApp({super.key});
  • 在 Dart 2.17 版本后,新增了简化的构造函数参数传递方式,即可以使用 super.key 来直接将 key 传递给父类的构造函数,而不需要显式地定义 Key 参数。

Use 'const' with the constructor to improve performance.

解决方案:

Use 'const' with the constructor to improve performance.

This class (or a class that this class inherits from) is marked as '@immutable', but one or more of its instance fields aren't final

文件开头加上:

// ignore_for_file: must_be_immutable

参考:

Flutter 常见警告 - 简书 (jianshu.com)


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/858724.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

指标管理+AI大模型深度融合,开启智能数据分析管理新时代

随着企业数字化转型的加速,数据管理和分析变得越来越重要。传统的指标管理平台虽然已经能够帮助企业有效地收集、计算、管理和展示关键指标,但在业务分析层面,面对日益复杂的数据环境和业务需求,单纯依靠人工分析已经难以满足高效、精准的管理要求。为此,将指标管理平台与…

nmon监控在linux环境下的安装

nmon下载官网: https://nmon.sourceforge.io/pmwiki.php?n=Site.Download一 、前言Nmon (Nigel’s Monitor)是由IBM 提供、免费监控 AIX 系统与 Linux 系统资源的工具。该工具可将服务器系统资源耗用情况收集起来并输出一个特定的文件,并可利用 excel 分析工具(nmon analyse…

项目管理系统 - 项目管理软件 | 禅道项目管理工具

引言在当今数字化时代,项目管理对于企业的成功至关重要。项目管理系统和软件层出不穷,其中禅道项目管理工具以其独特的优势脱颖而出。禅道作为一款开源的项目管理软件,涵盖了项目管理的各个方面,为企业提供了全面、高效的管理解决方案。无论是软件开发项目、工程建设项目还…

18款顶级在线项目管理网站分享,助你高效管理项目

在当今数字化时代,项目管理的效率和效果对于企业的成功至关重要。在线项目管理工具为企业提供了便捷、高效的解决方案,帮助团队更好地规划、执行和监控项目。本文将介绍18款顶级在线项目管理网站,涵盖不同类型的项目管理工具,希望能为读者带来启发,助力他们在项目管理中取…

大模型提示工程

大模型提示工程转:9 大模型提示词工程应用_哔哩哔哩_bilibili 1. 原则2. 清晰的指令2.1. 分隔符大模型基于概率生成,每次生成的话不一样 2.2. 结构化输出使用网页,直接复制文本 使用接口,就用代码 2.3. 参考示例2.4. 角色扮演3. 让模型思考3.1. 指定步骤大模型只是提供的便…

配置manage路由,实现嵌套路由

1、npm install vue-router 引入vue-router main.ts增加配置 import router from ./routes createApp(App).use(router) 2、src下新建目录routes,新建index.ts // index.ts import { createRouter, createWebHistory } from vue-router; // 引入Vue组件 import Home from ../p…

leetcode 1045

leetcode 1045select customer_id from (select customer_id,count(*) mfrom (select distinct * from Customer) a group by customer_id having count(*) in (select count(*) from Product))p ;日记 23号是周一,到今天圣诞节都没有去上班,请假了,主要是软工的课设要忙,事…

ThreadLocal与InheritableThreadLocal

ThreadLocal底层是个map每次set值的时候把当前线程与值放到里面ThreadLocal.ThreadLocalMap threadLocals = null; 这种结构在大数据量并发请求时会,会产生内存泄漏。 请求时set进去,正常退出move掉,来不及remove的数据会停留在内存中,外界还有引用,gc不会收就会泄露如果子…

mysql 127.0.0.1连接正常,使用ip无法连接

mysql 127.0.0.1连接正常,使用ip无法连接 1. 使用 127.0.0.1连接mysql mysql -uroot -p -h127.0.0.12. 使用ip连接mysql # 查看当前虚机的ip地址 ip a # 使用ip地址连接mysql mysql -uroot -p -h192.168.91.133错误信息: ERROR 1130 (HY000): Host 192.168.91.133 is not allow…

el-Pagination的pagerCount传参报错

◾呈现的问题 控制台一直警告,看着很不爽,内容如下 [Vue warn]: Invalid prop: custom validator check failed for prop "pagerCount". found in ---> <ElPagination> <Pagination> <PolicyInfo> at src/views/policy/policyI…

最小二乘法-直线拟合-C语言

‌最小二乘法是一种数学统计方法,它通过最小化误差的平方和来寻找数据的最佳函数匹配‌。具体来说,它用于解决曲线拟合问题,即找到一个函数,使得该函数在给定数据点上的误差(通常是垂直距离)的平方和最小。这种方法广泛应用于数据分析和机器学习等领域,特别是在处理线性…

300+ Excel可视化图表模板:13种分类助你轻松制作专业图表

正文: 在职场中,专业的数据可视化能力是一项非常重要的技能。而使用高质量的Excel图表模板,可以让你的数据分析和展示工作更加高效!今天为大家推荐一份300+ Excel可视化图表模板合集,涵盖13种图表分类,适用于多种办公场景。 无论是数据分析、项目管理,还是日常汇报,这些…