flutterdartflutter-provider

Data from FutureProvider prints two different variables who have same value for an instance only once , why?


I have a data model Product whose data is stored in firestore. When I read its data using Provider and print the fields of product dim_x and dim_y, I only get values printed which are different. For example,

I have 2 products P1 with dim_x = 200.0 and dim_y = 100.0 P2 with dim_x = 80.0 and dim_y = 80.0

The print command in my code below prints 80.0 only once, why is that? ({200.0, 100.0}, {80.0}) why not ({200.0, 100.0}, {80.0, 80.0}) is printed?

class Product {
  final String pid;
  final double dim_x;
  final double dim_y;
  
  Product(
      {required this.pid,
      required this.dim_x,
      required this.dim_y,})
}

class CreateJob extends StatefulWidget {
  CreateJob({super.key});

  @override
  State<CreateJob> createState() => _CreateJobState();
}

class _CreateJobState extends State<CreateJob> {

Future<List<Product>> fetchProductsFromBase() async {
  // .. code for getting data from firestore collection
}

@override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        FutureProvider<List<Product>>(create: (_) => fetchProductsFromBase(), initialData: []),
        // ...,
      ],
      child: SafeArea(
//...somewhere down the widget tree
//ScheduledDelivery()
}

class ScheduledDelivery extends StatefulWidget {

  const ScheduledDelivery({super.key});

  @override
  State<ScheduledDelivery> createState() => _ScheduledDeliveryState();
}

class _ScheduledDeliveryState extends State<ScheduledDelivery> {
  late List<Product> productList;

  @override
  void initState() {
    super.initState();
    productList = context.read<List<Product>>();
  }

  @override
  Widget build(BuildContext context) {
    print('\n${productList.map((e) => {e.dim_x, e.dim_y})}\n');
// ...

}

Solution

  • This is a Set: {e.dim_x, e.dim_y}. Set cannot have duplicate value.

    You might be looking for Record instead.

    Change {e.dim_x, e.dim_y} to (e.dim_x, e.dim_y). Or just use a proper string interpolation to print the values.