json_getter 0.0.2 copy "json_getter: ^0.0.2" to clipboard
json_getter: ^0.0.2 copied to clipboard

A useful Flutter package tool to extract values from JSON.

example/lib/main.dart

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

import 'data.mocks.dart';

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

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

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'Flutter JSON Getter Example',
      debugShowCheckedModeBanner: false,
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

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

class _MyHomePageState extends State<MyHomePage> {
  ValueNotifier<List<Product>> productList = ValueNotifier([]);

  Future<void> _getProducts() async {
    productList.value = productJsonMock
        .map((json) => Product.fromJson(json, filters: filtersConfigMock))
        .toList();
  }

  @override
  void initState() {
    super.initState();
    _getProducts();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: ValueListenableBuilder(
        valueListenable: productList,
        builder: (context, value, child) {
          return ListView.builder(
            itemCount: value.length,
            itemBuilder: (context, index) {
              return ProductCard(product: value[index]);
            },
          );
        },
      ),
    );
  }
}

class Product {
  Product({
    this.name,
    this.price,
    this.image,
    this.customFields,
  });

  factory Product.fromJson(
    Map<String, dynamic> json, {
    Map<String, Map<String, List<Map<String, String?>>>>? filters,
  }) {
    final name = json['name']?.toString();

    final price = json['price']?.toString();

    final images = json['images'];
    final image = (images is List<Map> && images.isNotEmpty)
        ? images[0]['src']?.toString()
        : null;

    final customFields = filters?.map(
      (key, filter) {
        return MapEntry(
          key,
          JsonGetter.get(
            filters: FiltersMapper.fromMap(filter),
            json: json,
          ),
        );
      },
    );

    return Product(
      name: name,
      price: price,
      image: image,
      customFields: customFields,
    );
  }

  final String? name;
  final String? image;
  final String? price;

  /// Custom fields from json_getter filters
  final Map<String, dynamic>? customFields;
}

class ProductCard extends StatelessWidget {
  const ProductCard({super.key, required this.product});

  final Product product;

  Widget _renderProductDetails(Product product) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      mainAxisSize: MainAxisSize.min,
      children: [
        if (product.name != null) Text(product.name!),
        if (product.price != null) Text('Price: \$${product.price}'),
        if (product.customFields?['categories']?.toString().isNotEmpty ?? false)
          Text(
            'Categories: ${product.customFields?['categories']}',
          ),
        if (product.customFields?['tags']?.toString().isNotEmpty ?? false)
          Text('Tags: ${product.customFields?['tags']}'),
      ],
    );
  }

  @override
  Widget build(BuildContext context) {
    final screenSize = MediaQuery.sizeOf(context);
    final isLandscape =
        MediaQuery.of(context).orientation == Orientation.landscape;

    return Container(
      padding: const EdgeInsets.all(8.0),
      margin: const EdgeInsets.all(8.0),
      decoration: BoxDecoration(
        border: Border.all(),
        borderRadius: BorderRadius.circular(8.0),
      ),
      child: (screenSize.width > 720 || isLandscape)
          ? Row(
              spacing: 8,
              children: [
                if (product.image != null)
                  Flexible(child: Image.network(product.image!)),
                _renderProductDetails(product),
              ],
            )
          : Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                if (product.image != null) Image.network(product.image!),
                _renderProductDetails(product),
              ],
            ),
    );
  }
}
0
likes
160
points
36
downloads

Publisher

unverified uploader

Weekly Downloads

A useful Flutter package tool to extract values from JSON.

Repository (GitHub)
View/report issues

Documentation

API reference

License

MIT (license)

Dependencies

dart_mappable, flutter

More

Packages that depend on json_getter