小编Jon*_*han的帖子

如何为 Flutter 方法编写稍后完成的单元测试?

我正在为 Flutter 方法编写一个单元测试,该方法调用异步方法然后返回,让异步按时完成。我的测试“在完成后”失败了。

这是我的测试:

    test('mark as viewed', () {
      final a = Asset();
      expect(a.viewed, false);
      a.markAsViewed();
      expect(a.viewed, true);
    });
Run Code Online (Sandbox Code Playgroud)

这是它正在测试的方法:

  void markAsViewed() {
    viewed = true;
    Repository.get().saveToStorage();
  }
Run Code Online (Sandbox Code Playgroud)

saveToStorage()方法是一个异步方法,我只是让它在后台执行。

我该如何进行这项工作?测试失败告诉我Make sure to use [expectAsync] or the [completes] matcher when testing async code.,但我不知道该怎么做。谁能解释一下或者指出我正确的文档吗?我找不到任何关于如何处理这些异步的信息,当它不是Future被返回时,而是被单独完成。

需要明确的是 - 这个单元测试并不是要测试它是否保存到存储中,只是对设置为 的基本viewed测试true

已编辑

错误如下:

package:flutter/src/services/platform_channel.dart 319:7  MethodChannel.invokeMethod
===== asynchronous gap ===========================
dart:async                                                _asyncErrorWrapperHelper
package:exec_pointers/asset_details.dart                  Repository.saveToStorage
package:exec_pointers/asset_details.dart 64:22            Asset.markAsViewed
test/asset_details_test.dart 57:9                         main.<fn>.<fn>
This test failed after it …
Run Code Online (Sandbox Code Playgroud)

flutter-test

5
推荐指数
1
解决办法
5909
查看次数

使用iOS SDK将文件上传到AWS S3时空白自定义元数据

我正在使用iOS将文件从iOS上传到S3,AWSS3TransferUtility并尝试在文件上设置自定义元数据。我正在使用元数据键X-Amz-Meta-uploadParameters和值“ Test”对其进行测试。

它正确显示在请求标头中:

... &X-Amz-Expires=2999&X-Amz-Meta-uploadParameters=Test&X-Amz-Security-Token= ...
Run Code Online (Sandbox Code Playgroud)

显然正在发生某些事情,因为密钥uploadparameters在S3控制台中的确出现在对象的属性中,但是具有空白值。要仔细检查我s3api --head-object在CLI中使用的内容,返回的内容如下:

{
    "AcceptRanges": "bytes",
    "LastModified": "Thu, 16 Mar 2017 08:04:41 GMT",
    "ContentLength": 1331730,
    "ETag": "\"[hex data here]\"",
    "ContentType": "image/jpeg",
    "Metadata": {
        "uploadparameters": ""
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我如何设置的值AWSS3TransferUtilityUploadExpression

        let params = [
            "X-Amz-Meta-uploadParameters": "Test"
        ]

        //Copy the custom Meta information into the expression
        for (key, value) in params {
            expression.setValue(value, forRequestParameter: key)
        }
Run Code Online (Sandbox Code Playgroud)

经历了各种各样的变化之后,我仍然离设置实际的元数据还很近。我在这里想念什么?

metadata amazon-s3 amazon-web-services ios aws-sdk

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

如何强制 ListView.builder 刷新?

在我的 Flutter 应用程序中,我有一个 ListView,其中包含几个定制的有状态小部件(EditableAreaCard 类型,基于来自定制区域对象的数据)。EditableAreaCard 可以是可编辑的,如果是这样,卡片上有一个编辑按钮,可以将其带入编辑模式 - 然后出现取消和保存按钮。

用户可以向列表中添加一个新项目 - 因此会创建一个 Area 对象,并设置一个标志,以便 ListView.builder 在可编辑模式下将此新 Area 对象添加到列表的顶部。

但是,当发生这种情况时,新对象会添加到列表顶部,但背景颜色错误且未处于编辑模式。观察这张卡片被编辑和关闭时的行为,很明显 ListView 并没有完全刷新它的所有子项,而是重用它们 - 索引 0 处的新项与之前的索引 0,现在已下推到索引 1。

这是代码 - 删除了卡片的内容,因为我认为它不相关......但如果需要,会发布它。


class AreasScreen extends StatefulWidget {
  static const id = '/areas';

  static _AreasScreenState of(BuildContext context) =>
      context.ancestorStateOfType(const TypeMatcher<_AreasScreenState>());

  @override
  _AreasScreenState createState() => _AreasScreenState();
}

class _AreasScreenState extends State<AreasScreen> {
  Areas _alist = AreaRepo.get();
  Area _new_area = null;
  bool _is_adding_area = false;

  void cancel_add_area() {
    setState(() {
      _new_area = null;
      _is_adding_area = false; …
Run Code Online (Sandbox Code Playgroud)

flutter

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