sim_api 0.0.5 copy "sim_api: ^0.0.5" to clipboard
sim_api: ^0.0.5 copied to clipboard

SimApi provides simulated APIs for development and testing in Flutter and Dart.

example/lib/main.dart

import 'package:flutter/material.dart';
import 'package:sim_api/models/sim_api_http_method.dart';
import 'package:sim_api/sim_api.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'SimApi Test'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final _apiClient = SimApi<String>();
  List<ItemResponse> _data = [];
  final _newItemController = TextEditingController();

  @override
  void initState() {
    super.initState();
    _seedData();
    _fetchData();
  }

  void _seedData() {
    _apiClient.registerRoute('/items');
    _apiClient.registerRoute(
      '/items',
      method: SimApiHttpMethod.patch,
      haveRouteParameters: true,
    );
    _apiClient.registerRoute(
      '/items',
      method: SimApiHttpMethod.delete,
      haveRouteParameters: true,
    );
    _apiClient.seedData('/items', {
      '1': ItemResponse(id: '1', name: 'Item 1').toJson(),
      '2': ItemResponse(id: '2', name: 'Item 2').toJson(),
      '3': ItemResponse(id: '3', name: 'Item 3').toJson(),
    });
  }

  Future<void> _fetchData() async {
    final response = await _apiClient.get(Uri.parse('/items'));
    if (response.statusCode == 200) {
      setState(() {
        _data = (response.body as List)
            .map((e) => ItemResponse.fromJson(e))
            .toList();
      });
    }
  }

  void _createItem() async {
    final newItem = ItemRequest(name: _newItemController.text);
    await _apiClient.post(Uri.parse('/items'), body: newItem.toJson());
    _newItemController.clear();
    _fetchData();
  }

  void _updateItem(String id) async {
    final updatedItem = ItemRequest(name: _newItemController.text);
    await _apiClient.patch(Uri.parse('/items/$id'), body: updatedItem.toJson());
    _newItemController.clear();
    _fetchData();
  }

  void _deleteItem(String id) async {
    await _apiClient.delete(Uri.parse('/items/$id'));
    _fetchData();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('SimApi Test'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: <Widget>[
            TextField(
              controller: _newItemController,
              decoration: const InputDecoration(
                labelText: 'New Item Name',
                border: OutlineInputBorder(),
              ),
            ),
            const SizedBox(height: 10),
            ElevatedButton(
              onPressed: _createItem,
              child: const Text('Create Item'),
            ),
            const SizedBox(height: 20),
            Expanded(
              child: ListView.builder(
                itemCount: _data.length,
                itemBuilder: (context, index) {
                  final item = _data[index];
                  final id = item.id;
                  return Card(
                    margin: const EdgeInsets.symmetric(vertical: 8.0),
                    elevation: 4,
                    child: ListTile(
                      contentPadding: const EdgeInsets.all(16.0),
                      title: Text(
                        item.name,
                        style: Theme.of(context).textTheme.headlineSmall,
                      ),
                      trailing: Row(
                        mainAxisSize: MainAxisSize.min,
                        children: <Widget>[
                          IconButton(
                            icon: const Icon(Icons.edit),
                            onPressed: () => _updateItem(id),
                          ),
                          IconButton(
                            icon: const Icon(Icons.delete),
                            onPressed: () => _deleteItem(id),
                          ),
                        ],
                      ),
                    ),
                  );
                },
              ),
            ),
          ],
        ),
      ),
    );
  }
}

class ItemRequest {
  final String name;

  ItemRequest({required this.name});

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

class ItemResponse {
  final String id;
  final String name;

  ItemResponse({required this.id, required this.name});

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

  factory ItemResponse.fromJson(Map<String, dynamic> json) {
    return ItemResponse(
      id: json['id'] as String,
      name: json['name'] as String,
    );
  }
}
1
likes
160
points
38
downloads

Publisher

unverified uploader

Weekly Downloads

SimApi provides simulated APIs for development and testing in Flutter and Dart.

Repository (GitHub)

Documentation

API reference

License

MIT (license)

Dependencies

flutter, http

More

Packages that depend on sim_api