view_matrix 1.0.0 copy "view_matrix: ^1.0.0" to clipboard
view_matrix: ^1.0.0 copied to clipboard

A flexible and extensible Flutter framework for rendering list and grid views with unified API and local data handling.

example/lib/main.dart

import 'package:flutter/material.dart';
import 'package:view_matrix/view_matrix.dart';

void main() => runApp(const ExampleApp());

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: "ViewMatrix Example",
      theme: ThemeData(primarySwatch: Colors.blue),
      home: const ExampleHome(),
    );
  }
}

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

  @override
  Widget build(BuildContext context) {
    return DefaultTabController(
      length: 4,
      child: Scaffold(
        appBar: AppBar(
          title: const Text("ViewMatrix Examples"),
          bottom: const TabBar(
            isScrollable: true,
            tabs: [
              Tab(text: "API - GET"),
              Tab(text: "API - POST"),
              Tab(text: "Local Grid"),
              Tab(text: "Fully Custom UI"),
            ],
          ),
        ),
        body: const TabBarView(
          children: [
            ApiGetExample(),
            ApiPostExample(),
            LocalGridExample(),
            FullCustomExample(),
          ],
        ),
      ),
    );
  }
}

//
// -------------------------------------------------------------
// 1️⃣ API GET EXAMPLE
// -------------------------------------------------------------
class ApiGetExample extends StatelessWidget {
  const ApiGetExample({super.key});

  @override
  Widget build(BuildContext context) {
    return ViewMatrix(
      viewType: ViewType.list,
      sourceType: SourceType.api,
      apiConfig: ApiConfig(
        url: "https://fakestoreapi.com/products",
        method: HttpMethod.get,
        enableLogging: true,
        showOnly: [
          DataItem.fieldImage,
          DataItem.fieldTitle,
          DataItem.fieldDescription,
          DataItem.fieldBadge,
        ],
        fieldMapping: {
          // Example: renaming API field → DataItem field
          DataItem.fieldTitle: "title",
          DataItem.fieldDescription: "description",
          DataItem.fieldImage: "image",
          DataItem.fieldBadge: "category"
        },
      ),
      uiConfig: ViewMatrixUIConfig(
        titleStyle: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600),
        descriptionStyle: const TextStyle(fontSize: 14, color: Colors.black54),
        badgeStyle: const TextStyle(color: Colors.blueAccent),
        cardRadius: 16,
        cardElevation: 4,
        imageHeight: 140,
        badgeBackgroundColor: Colors.blue.shade50,
        loaderColor: Colors.indigo,
      ),
    );
  }
}

//
// -------------------------------------------------------------
// 2️⃣ API POST (JSON + Multipart Auto)
// -------------------------------------------------------------
class ApiPostExample extends StatelessWidget {
  const ApiPostExample({super.key});

  @override
  Widget build(BuildContext context) {
    return ViewMatrix(
      viewType: ViewType.list,
      sourceType: SourceType.api,
      apiConfig: ApiConfig(
        url: "https://jsonplaceholder.typicode.com/posts",
        method: HttpMethod.post,
        enableLogging: true,
        body: {
          "title": "ViewMatrix User",
          "body": "Flutter Developer",
          "userId": 1
        },
        successStatusCodes: [200, 201, 202, 204],
        showOnly: [
          DataItem.fieldTitle,
          DataItem.fieldDescription,
          DataItem.fieldBadge
        ],
        fieldMapping: {
          DataItem.fieldTitle: "title",
          DataItem.fieldDescription: "body",
          DataItem.fieldBadge: "userId"
        },
      ),
      uiConfig: ViewMatrixUIConfig(
        titleStyle: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
        badgeBackgroundColor: Colors.green.shade50,
        badgeStyle: const TextStyle(color: Colors.green),
        loaderColor: Colors.green,
      ),
    );
  }
}

//
// -------------------------------------------------------------
// 3️⃣ LOCAL GRID EXAMPLE
// -------------------------------------------------------------
class LocalGridExample extends StatelessWidget {
  const LocalGridExample({super.key});

  @override
  Widget build(BuildContext context) {
    return ViewMatrix(
      viewType: ViewType.grid,
      sourceType: SourceType.nonApi,
      localItems: [
        DataItem(title: "Laptop", description: "Macbook Pro", badge: "Tech"),
        DataItem(title: "Bike", description: "Yamaha R15", badge: "Vehicles"),
        DataItem(title: "Shoes", description: "Nike Air", badge: "Fashion"),
      ],
      uiConfig: ViewMatrixUIConfig(
        gridCrossAxisCount: 3,
        cardRadius: 18,
        imageHeight: 100,
        badgeBackgroundColor: Colors.orange.shade50,
        badgeStyle: const TextStyle(color: Colors.deepOrange),
      ),
    );
  }
}

//
// -------------------------------------------------------------
// 4️⃣ FULLY CUSTOM UI EXAMPLE (Custom Card Builder)
// -------------------------------------------------------------
class FullCustomExample extends StatelessWidget {
  const FullCustomExample({super.key});

  @override
  Widget build(BuildContext context) {
    return ViewMatrix(
      viewType: ViewType.grid,
      sourceType: SourceType.api,
      apiConfig: ApiConfig(
        url: "https://fakestoreapi.com/products",
        method: HttpMethod.get,
        enableLogging: false,
        fieldMapping: {
          DataItem.fieldTitle: "title",
          DataItem.fieldDescription: "description",
          DataItem.fieldImage: "image",
        },
      ),
      uiConfig: ViewMatrixUIConfig(
        gridCrossAxisCount: 2,
        customGridBuilder: (item) {
          return Container(
            margin: const EdgeInsets.all(10),
            decoration: BoxDecoration(
              color: Colors.black87,
              borderRadius: BorderRadius.circular(18),
            ),
            child: Column(
              children: [
                Expanded(
                  child: ClipRRect(
                    borderRadius:
                        const BorderRadius.vertical(top: Radius.circular(18)),
                    child: Image.network(
                      item.image ?? "",
                      fit: BoxFit.cover,
                      width: double.infinity,
                      errorBuilder: (_, __, ___) =>
                          const Icon(Icons.broken_image),
                    ),
                  ),
                ),
                Padding(
                  padding: const EdgeInsets.all(12),
                  child: Text(
                    item.title,
                    style: const TextStyle(color: Colors.white, fontSize: 16),
                  ),
                ),
              ],
            ),
          );
        },
      ),
    );
  }
}
3
likes
0
points
6
downloads

Publisher

verified publisherronak-vasoliya.devservers.site

Weekly Downloads

A flexible and extensible Flutter framework for rendering list and grid views with unified API and local data handling.

Homepage

License

unknown (license)

Dependencies

flutter, http, intl

More

Packages that depend on view_matrix