最近迁移到 Flutter null 安全功能,我有很多类需要更新。
对于我的模型,我使用fromJsonjson 对象反序列化数据。late这迫使我为每个非可选字段添加关键字。
这是正确的做法吗?
class ServerSession {
late String sessionId;
late String refreshToken;
late String accessToken;
ServerSession({required this.sessionId, required this.refreshToken, required this.accessToken});
ServerSession.fromJson(Map<String, dynamic> json) {
sessionId = json['session_id'] ?? json['sessionId'];
refreshToken = json['refresh_token'] ?? json['refreshToken'];
accessToken = json['access_token'] ?? json['accessToken'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['sessionId'] = this.sessionId;
data['refreshToken'] = this.refreshToken;
data['accessToken'] = this.accessToken;
return data;
}
}
Run Code Online (Sandbox Code Playgroud) 由于dart 中的空安全性,我们必须更新代码测试。我们使用mockito来模拟给定类的依赖关系。根据他们的文档,我们决定使用build_runner方法来生成依赖项的模拟类。.mocks.dart这是在与测试文件相同的文件夹中创建扩展名的文件。由于这些是生成文件,我们应该对它们进行源代码控制,还是将它们放在.gitignore?
>2.12所以我正在进行更改,但我陷入了这个特定的错误,无法找到任何解决方案。non-nullable“空安全”问题后引起的 Future<bool?> _onBackPressed() async {
return showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('Do you want to exit without saving changes?'),
content:
Text('Please press the SAVE button at the bottom of the page'),
actions: <Widget>[
TextButton(
child: Text('NO'),
onPressed: () {
Navigator.of(context).pop(false);
},
),
TextButton(
child: Text('YES'),
onPressed: () {
Navigator.of(context).pop(true);
Navigator.of(context).pop(true);
},
),
],
);
});
}
..
return WillPopScope(
onWillPop: () => _onBackPressed, // causing error
child: …Run Code Online (Sandbox Code Playgroud) 我正在尝试设置密码和电子邮件验证,但收到上述错误。任何帮助将不胜感激。上面的错误出现在main.dart代码中,并且已经在代码中加粗了。
validator.dart 代码
enum FormType { login, register }
class EmailValidator {
static String? validate(String value) {
return value.isEmpty ? "Email can't be empty" : null;
}
}
class PasswordValidator {
static String? validate(String value) {
return value.isEmpty ? "Password can't be empty" : null;
}
}
Run Code Online (Sandbox Code Playgroud)
main.dart 代码
List<Widget>buildInputs() {
return [
TextFormField(
validator: **EmailValidator.validate**,
decoration: InputDecoration(labelText: 'Email'),
onSaved: (value) => _email = value,
),
TextFormField(
validator: **PasswordValidator.validate**,
decoration: InputDecoration(labelText: 'Password'),
obscureText: true,
onSaved: (value) => _password = value, …Run Code Online (Sandbox Code Playgroud) 自从 Flutter null-safety 更新后,我的旧代码就被破坏了。我设法修复了大部分问题,但这一点仍然没有解决。
首先是代码:
class _MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
return StreamProvider<MyUser>.value( //initialData required here now
value: AuthService().user,
child: MaterialApp(
home: Wrapper(),
),
);
}
}
Run Code Online (Sandbox Code Playgroud)
该代码过去可以工作,但现在它要求将initialData 作为StreamProvider 的参数传递。我的“MyUser”课程如下:
// Create custom User Model to get only the uid
class MyUser {
final String uid;
MyUser({required this.uid});
}
Run Code Online (Sandbox Code Playgroud)
我的问题只是我不确定在这种情况下我的初始数据应该是什么。我的 AuthService 类基本上是一个具有“使用电子邮件和密码登录”、“使用电子邮件和密码注册”等功能的类,全部来自 Firebase。像这样:
// Create user object based on FirebaseUser
MyUser _userFromFirebaseUser(User? user) {
return MyUser(uid: user!.uid);
}
// Auth change user stream
Stream<MyUser> get user …Run Code Online (Sandbox Code Playgroud) 从 Dart 开始2.12.0,默认情况下启用空安全。
关于“启用空安全”部分的dart.dev说明如下:
将 SDK 约束设置为需要具有空安全支持的语言版本。例如,您的 pubspec.yaml 文件可能具有以下约束:
Run Code Online (Sandbox Code Playgroud)environment: sdk: ">=2.12.0-0 <3.0.0"
那么既然它默认启用了,当我们的 SDK 约束有 时,我们>=2.12.0-0如何选择退出空安全并像以前一样编写代码?
我们可能需要像这样的 Dart 版本来实现不同的语言功能,但不想使用 NNBD。
我使用Android Studio创建了一个新的Flutter 项目。我正在使用空安全,并且正在物理设备上运行应用程序,但代码生成不起作用, .dart_tool文件夹中没有flutter_gen文件夹,只有flutter_build文件夹。
\n我按照Flutter 官方国际化文档中的步骤操作
\n我没有使用Flutter Intl插件,因为它不支持空安全(我知道你可以制作一个脚本在每个生成的文件的顶部添加旧的 dart 版本作为解决方法)
\nflutter doctor 命令输出:
\n[\xe2\x9c\x93] Flutter (Channel beta, 1.26.0-17.5.pre, on Microsoft Windows [Versi\xc3\x83\xc2\xb3n 10.0.19042.804], locale es-ES)\n \xe2\x80\xa2 Flutter version 1.26.0-17.5.pre at <PATH>\n \xe2\x80\xa2 Framework revision 1fe38dcb5f (3 days ago), 2021-02-10 16:25:47 -0800\n \xe2\x80\xa2 Engine revision d4453f6018\n \xe2\x80\xa2 Dart version 2.12.0 (build 2.12.0-259.9.beta)\n\n[\xe2\x9c\x93] Android toolchain - develop for Android devices (Android SDK …Run Code Online (Sandbox Code Playgroud) 简而言之,我正在学习 ResoCoder TDD 课程。该课程有点过时,但我很确定遵循并一路进行调整是可以的。本课程的课程和 GitHub 中的代码不是空安全的。
而且我没有完全按照课程进行。我在这里和那里做了一些改变。
我刚刚进入该课程的第 2 集或第 3 集以了解背景。
auth_usecases_test.dart
import 'package:dartz/dartz.dart';
import 'package:mockito/mockito.dart';
import 'package:storayge/core/auth/domain/entities/local_user.dart';
import 'package:storayge/core/auth/domain/repository/auth_repository.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:storayge/core/auth/domain/usecases/auth_usecases.dart';
class MockAuthRepository extends Mock implements AuthRepository {}
void main() {
late GetLocalUserDataFromRemote usecase;
late MockAuthRepository mockAuthRepository;
late String tUid;
late LocalUser tLocalUser;
setUp(() {
mockAuthRepository = MockAuthRepository();
usecase = GetLocalUserDataFromRemote(repository: mockAuthRepository);
tLocalUser = const LocalUser(
username: 'testUsername',
email: 'testEmail@Email',
uid: 'testUid',
);
tUid = 'testUid';
});
test(
'should get LocalUser data from the repository',
() …Run Code Online (Sandbox Code Playgroud) 这段代码在没有 null 安全性的情况下运行良好:
void main() {
final a = X(22.5);
final b = X(22.5);
List<X> x = [a, b];
var tot = x.fold(0.0, (a, b) => a + b.dist);
print(tot);
}
class X {
final double dist;
X(this.dist);
}
Run Code Online (Sandbox Code Playgroud)
在零安全性下,我们得到:
不能无条件调用运算符“+”,因为接收者可以为“null”。尝试向目标添加空检查('!')。
不知道目标是谁/什么或接收者。我已经阅读了有关 null 安全性的所有 Dart 材料,但无法将其构建为箭头表达式 ( => a + b.dist)。
谢谢你的帮助!
我是 Flutter 开发的新手,在我的代码中为什么我收到此错误(taskTitle必须初始化不可为空的实例字段),尽管在 constructor 中初始化了实例字段。
因此,我假设每当创建此类实例时,用户都需要提供两个强制成员,因此不应发生此错误(尽管如果添加 Late 修饰符此错误就会消失)。
请解答我的疑惑。
class Task {
String taskTitle;
bool isDone = false;
Task(String taskTitle, bool isDone) {
this.taskTitle = taskTitle;
this.isDone = isDone;
}
}
Run Code Online (Sandbox Code Playgroud) dart-null-safety ×10
dart ×8
flutter ×8
asynchronous ×1
firebase ×1
tdd ×1
unit-testing ×1
validation ×1