Flutter模拟数据插件flutter_mockitory的使用

Flutter模拟数据插件flutter_mockitory的使用

本包的目的是帮助测试Flutter应用时使用假数据,而无需更改代码。

通过使用Mockitory插件,你可以在应用本身内通过添加flutter_mockitory小部件来模拟数据层。

如何使用它?

添加依赖项

pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter_mockitory: 

如果你想要使用纯Dart的Mockitory(例如用于服务器应用程序),请使用mockitory依赖项而不是flutter_mockitory

使用Mockitory混合类

首先,创建一个包含Mockitory的小部件。例如:

import 'package:mockitory/mockitory.dart';

enum Gender { male, female }

class ExampleMockitory with Mockitory {
  [@override](/user/override)
  Map<String, MockValue> get initialMockValues => {
        'boolValue': MockValue<bool>(true),
        'intValue': MockValue<int>(1),
        'doubleValue': MockValue<double>(4.5),
        'gender': MockValue<Gender>(Gender.male),
        'listOfInts': MockValue<List<int>>([0, 1]),
        'dateValue': MockValue<DateTime>(DateTime(2020, 5, 5)),
      };

  Stream<Gender> observeGender() => observeMockValueUpdates<Gender>('gender')
      .map((mockValue) => mockValue.value);

  DateTime getDateValue() => getValue<DateTime>('dateValue');
}

注意: 记住要使用类型化的MockValue对象。例如:MockValue<bool>(true)

使用MockitoryPage小部件

MockitoryPage小部件用于自动生成用于更新/显示假数据的小部件列表。

final mockitory = ExampleMockitory();

...

MockitoryPage(
  mockitory: mockitory,
  customDelegates: [
    CustomBoolMockValueDelegate(),
    ChoicesMockValueDelegate<Gender>([Gender.male, Gender.female]),
    IterableMockValueDelegate([
      [0, 1],
      [0, 2]
    ]),
  ],
),

内置的MockValue代理

代理用于定义如何构建用于操作假数据的小部件。

这些代理默认被使用:

  • BoolMockValueDelegate
  • StringMockValueDelegate
  • IntMockValueDelegate
  • DoubleMockValueDelegate
  • DateTimeMockValueDelegate

这些代理需要添加到MockitoryPage小部件的customDelegates属性中:

  • ChoicesMockValueDelegate<T> - 例如 ChoicesMockValueDelegate<Gender>([Gender.male, Gender.female])
  • IterableMockValueDelegate<T> - 例如 IterableMockValueDelegate<int>([0, 1], [1, 4, 5])

自定义代理

你可以提供自己的自定义代理。例如:

class CustomBoolMockValueDelegate extends MockValueDelegate<bool> {
  [@override](/user/override)
  Widget buildMockValueWidget(BuildContext context, bool value, onChanged) {
    return Checkbox(
      activeColor: Colors.red,
      value: value,
      onChanged: (value) => onChanged(MockValue(value)),
    );
  }
}

完整示例代码

以下是完整的示例代码,展示了如何使用flutter_mockitory插件:

import 'package:flutter/material.dart';
import 'package:flutter_mockitory/flutter_mockitory.dart';
import 'package:mockitory_example/example_mockitory.dart';

void main() {
  runApp(MyApp());
}

class CustomBoolMockValueDelegate extends MockValueDelegate<bool> {
  [@override](/user/override)
  Widget buildMockValueWidget(BuildContext context, bool value, onChanged) {
    return Checkbox(
      activeColor: Colors.red,
      value: value,
      onChanged: (value) {
        if (value != null) onChanged(MockValue(value));
      },
    );
  }
}

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  ExampleMockitory mockitory1 = ExampleMockitory();
  ExampleMockitory mockitory2 = ExampleMockitory();

  GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey();

  int _page = 0;

  [@override](/user/override)
  void initState() {
    super.initState();
    mockitory1.observeGender().listen((gender) {
      ScaffoldMessenger.maybeOf(context)?.showSnackBar(
        SnackBar(content: Text('Gender updated: $gender')),
      );
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    final pages = [
      MockitoryPage(
        key: ValueKey(1),
        mockitory: mockitory1,
        customDelegates: [
          CustomBoolMockValueDelegate(),
          ChoicesMockValueDelegate<Gender>([Gender.male, Gender.female]),
          IterableMockValueDelegate([
            [0, 1],
            [0, 2]
          ]),
        ],
      ),
      MockitoryPage(
        key: ValueKey(2),
        mockitory: mockitory2,
      ),
    ];

    return MaterialApp(
      title: 'Mockitory demo',
      home: Scaffold(
        key: _scaffoldKey,
        body: pages[_page],
        bottomNavigationBar: BottomNavigationBar(
          currentIndex: _page,
          onTap: (value) {
            setState(() => _page = value);
          },
          items: [
            BottomNavigationBarItem(
              icon: Icon(Icons.ac_unit),
              label: 'Mockitory 1',
            ),
            BottomNavigationBarItem(
              icon: Icon(Icons.access_alarm_outlined),
              label: 'Mockitory 2',
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter模拟数据插件flutter_mockitory的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter模拟数据插件flutter_mockitory的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_mockitory 是一个用于在 Flutter 应用中模拟数据的插件。它可以帮助开发者在开发过程中快速生成和模拟数据,而无需依赖真实的后端服务。这对于前端开发和测试非常有用。

安装 flutter_mockitory

首先,你需要在 pubspec.yaml 文件中添加 flutter_mockitory 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_mockitory: ^0.1.0  # 请检查最新版本

然后运行 flutter pub get 来安装依赖。

使用 flutter_mockitory

1. 创建模拟数据模型

首先,你需要定义一个数据模型。例如,假设我们有一个 User 模型:

class User {
  final String id;
  final String name;
  final String email;

  User({required this.id, required this.name, required this.email});

  factory User.fromJson(Map<String, dynamic> json) {
    return User(
      id: json['id'],
      name: json['name'],
      email: json['email'],
    );
  }

  Map<String, dynamic> toJson() {
    return {
      'id': id,
      'name': name,
      'email': email,
    };
  }
}

2. 创建模拟数据生成器

接下来,你可以使用 flutter_mockitory 来生成模拟数据。首先,创建一个模拟数据生成器:

import 'package:flutter_mockitory/flutter_mockitory.dart';

class UserMockitory extends Mockitory<User> {
  UserMockitory() : super(
    generator: () {
      return User(
        id: Mockitory.randomString(),
        name: Mockitory.randomString(),
        email: Mockitory.randomEmail(),
      );
    },
  );
}

在这个例子中,UserMockitory 继承自 Mockitory<User>,并定义了一个生成器函数,该函数生成一个随机的 User 对象。

3. 生成模拟数据

现在你可以使用 UserMockitory 来生成模拟数据:

void main() {
  final userMockitory = UserMockitory();

  // 生成单个模拟用户
  final user = userMockitory.generate();
  print(user.toJson());

  // 生成多个模拟用户
  final users = userMockitory.generateList(5);
  users.forEach((user) => print(user.toJson()));
}

4. 使用模拟数据进行测试

你可以在测试中使用这些模拟数据。例如:

import 'package:flutter_test/flutter_test.dart';

void main() {
  test('Test user data generation', () {
    final userMockitory = UserMockitory();
    final user = userMockitory.generate();

    expect(user.id, isNotNull);
    expect(user.name, isNotNull);
    expect(user.email, isNotNull);
  });
}
回到顶部