标签: dart-null-safety

使用 fromJson 实现 Flutter null 安全

最近迁移到 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 flutter dart-null-safety

3
推荐指数
1
解决办法
7737
查看次数

我们是否应该对 build_runner 为mockito 创建的 .mocks.dart 文件进行源代码控制

由于dart 中的空安全性,我们必须更新代码测试。我们使用mockito来模拟给定类的依赖关系。根据他们的文档,我们决定使用build_runner方法来生成依赖项的模拟类。.mocks.dart这是在与测试文件相同的文件夹中创建扩展名的文件。由于这些是生成文件,我们应该对它们进行源代码控制,还是将它们放在.gitignore

tdd flutter dart-null-safety

3
推荐指数
1
解决办法
1234
查看次数

根据闭包上下文的要求,返回类型“Future&lt;bool?&gt; Function()”不是“Future&lt;bool&gt;”

  • 我已经将我的项目 sdk 升级到了,>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)

dart flutter dart-null-safety

3
推荐指数
1
解决办法
1万
查看次数

参数类型“字符串?” Function(String)' 无法分配给参数类型 'String? 函数(字符串?)?'

我正在尝试设置密码和电子邮件验证,但收到上述错误。任何帮助将不胜感激。上面的错误出现在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)

validation dart flutter dart-null-safety

3
推荐指数
1
解决办法
4638
查看次数

Flutter 错误:添加 null 安全后,StreamProvider 需要初始数据参数。来自 Firebase 的 StreamProvider&lt;UserModel&gt;

自从 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 firebase flutter dart-null-safety

3
推荐指数
1
解决办法
756
查看次数

你如何在 Dart 中选择退出 null 安全?

从 Dart 开始2.12.0,默认情况下启用空安全

关于“启用空安全”部分的dart.dev说明如下:

将 SDK 约束设置为需要具有空安全支持的语言版本。例如,您的 pubspec.yaml 文件可能具有以下约束:

environment:
 sdk: ">=2.12.0-0 <3.0.0"
Run Code Online (Sandbox Code Playgroud)

那么既然它默认启用了,当我们的 SDK 约束有 时,我们>=2.12.0-0如何选择退出空安全并像以前一样编写代码?
我们可能需要像这样的 Dart 版本来实现不同的语言功能,但不想使用 NNBD。

dart dart-null-safety

2
推荐指数
1
解决办法
1149
查看次数

Flutter 国际化,国际代码生成不起作用

我使用Android Studio创建了一个新的Flutter 项目。我正在使用空安全,并且正在物理设备上运行应用程序,但代码生成不起作用, .dart_tool文件夹中没有flutter_gen文件夹,只有flutter_build文件夹。

\n

我按照Flutter 官方国际化文档中的步骤操作

\n

我没有使用Flutter Intl插件,因为它不支持空安全(我知道你可以制作一个脚本在每个生成的文件的顶部添加旧的 dart 版本作为解决方法)

\n

flutter 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)

code-generation android-studio flutter dart-null-safety

2
推荐指数
1
解决办法
1万
查看次数

Flutter - Mockito - 在测试中使用 async 会产生错误,但使用 async* 可以正常工作吗?

简而言之,我正在学习 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)

unit-testing asynchronous dart flutter dart-null-safety

2
推荐指数
1
解决办法
3708
查看次数

如何将列表折叠迁移到空安全

这段代码在没有 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)。

谢谢你的帮助!

dart dart-null-safety

2
推荐指数
1
解决办法
352
查看次数

必须初始化不可为 null 的实例字段“taskTitle”

我是 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 flutter dart-null-safety

2
推荐指数
1
解决办法
5319
查看次数