flutter_fixtures_core 0.1.1
flutter_fixtures_core: ^0.1.1 copied to clipboard
Core interfaces and domain models for Flutter Fixtures
Flutter Fixtures Core #
Core interfaces and domain models for the Flutter Fixtures library. This package provides the foundational abstractions that enable extensible fixture-based mocking.
π― Purpose #
This package defines the core contracts and data models used by all Flutter Fixtures implementations. Use this package when:
- Creating custom data providers (database, file system, network, etc.)
- Extending the Flutter Fixtures ecosystem with new data source functionality
- Building libraries that need fixture-based mocking capabilities
π¦ What's Included #
Interfaces #
DataQuery<Input, Output>
: Abstract interface for querying data sourcesDataSelectorView
: Interface for fixture selection componentsFixtureSelector
: Mixin providing fixture selection functionality
Data Models #
FixtureCollection
: Container for multiple fixture response optionsFixtureDocument
: Individual fixture response definition
Selection Strategies #
DataSelectorType
: Sealed class defining fixture selection strategiesRandom()
: Randomly select from available fixturesDefault()
: Use the fixture marked as defaultPick()
: Let user choose through UI
π Quick Start #
Add to your pubspec.yaml
:
dependencies:
flutter_fixtures_core: ^0.1.0
π οΈ Creating Custom Data Providers #
Implement the DataQuery
interface to create custom data sources:
import 'package:flutter_fixtures_core/flutter_fixtures_core.dart';
class DatabaseDataQuery implements DataQuery<String, Map<String, dynamic>> {
final Database database;
DatabaseDataQuery(this.database);
@override
Future<Map<String, dynamic>?> find(String query) async {
// Query your database
final result = await database.query('fixtures', where: 'query = ?', whereArgs: [query]);
return result.isNotEmpty ? result.first : null;
}
@override
Future<FixtureCollection?> parse(Map<String, dynamic> source) async {
// Parse database result into fixture collection
return FixtureCollection(
description: source['description'],
items: (source['options'] as List).map((item) =>
FixtureDocument(
identifier: item['id'],
description: item['description'],
defaultOption: item['is_default'] ?? false,
data: item['response_data'],
)
).toList(),
);
}
@override
Future<Map<String, dynamic>?> data(FixtureDocument document) async {
// Return the response data
return document.data;
}
@override
Future<FixtureDocument?> select(
FixtureCollection fixture,
DataSelectorView? view,
DataSelectorType selector,
) async {
// Use the FixtureSelector mixin for standard selection logic
return switch (selector) {
Pick() => await view?.pick(fixture),
Default() => fixture.items.firstWhere((item) => item.defaultOption ?? false),
Random() => fixture.items[Random().nextInt(fixture.items.length)],
};
}
}
π§© Using the FixtureSelector Mixin #
The FixtureSelector
mixin provides standard fixture selection logic:
class MyDataProvider with FixtureSelector implements DataQuery<String, Map<String, dynamic>> {
@override
Future<Map<String, dynamic>?> find(String input) async {
// Your find implementation
}
@override
Future<FixtureCollection?> parse(Map<String, dynamic> source) async {
// Your parse implementation
}
@override
Future<Map<String, dynamic>?> data(FixtureDocument document) async {
// Your data implementation
}
// select() method is provided by the FixtureSelector mixin
}
π Data Model Reference #
FixtureCollection #
Container for multiple fixture response options:
final collection = FixtureCollection(
description: 'User API responses',
items: [
FixtureDocument(
identifier: 'success',
description: '200 Success',
defaultOption: true,
data: {'users': [...]},
),
// ... more fixtures
],
);
FixtureDocument #
Individual fixture response definition:
final document = FixtureDocument(
identifier: 'success', // Unique identifier
description: '200 Success', // Human-readable description
defaultOption: true, // Whether this is the default choice
data: {'users': [...]}, // Inline response data
dataPath: 'users_large.json', // Or path to external data file
);
DataSelectorType #
Fixture selection strategies:
// Always use default fixture
final defaultSelector = DataSelectorType.defaultValue();
// Randomly select fixture
final randomSelector = DataSelectorType.random();
// Let user choose via UI (requires DataSelectorView implementation)
final pickSelector = DataSelectorType.pick();
DataSelectorView #
Interface for implementing fixture selection mechanisms:
abstract class DataSelectorView {
Future<FixtureDocument?> pick(FixtureCollection fixture);
}
This interface is implemented by UI packages to provide user-driven fixture selection. The core package defines the contract, while implementation packages (like flutter_fixtures_ui
) provide concrete implementations.
π Integration #
This package provides the foundation for:
- flutter_fixtures_dio: Dio HTTP client implementation
- flutter_fixtures_ui: UI components for fixture selection
- flutter_fixtures: Complete library with all components
Use this package directly when building custom data providers or extending the Flutter Fixtures ecosystem.
π Examples #
For complete examples and usage patterns, see the Flutter Fixtures repository.
π€ Contributing #
Contributions are welcome! Please read our contributing guide.
π License #
MIT License - see the LICENSE file for details.