Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Selector is calling its builder every time notifyListeners() is called #884

Closed
UtkarshJagtap opened this issue Aug 26, 2024 · 1 comment
Closed
Assignees
Labels
bug Something isn't working needs triage

Comments

@UtkarshJagtap
Copy link

Describe the bug
Selector widget is calling its builder every time notifyListeners() is called even if the selected value is not changed

To Reproduce

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'dart:developer' as de;
import 'dart:math';
void main() {
  runApp(const MyApp());
}

class SomeDataProvider extends ChangeNotifier{

  List<Beaker> beakers = <Beaker>[];
  String message ='';
  
 //only changes message
  void changemessage(){
    message = Random().nextDouble().toString();
    notifyListeners();
   }
  
  //changes list and message
  void addNewBeaker(){
    int t = Random().nextInt(100);
    int te = Random().nextInt(100);
    beakers = [...beakers, Beaker(temp: te, rpm: t)];
    message = '$t and $te are added';
  //  beakers.add(Beaker(temp: te, rpm: t));
    notifyListeners();
  }
}

class Beaker {
  Beaker({required this.temp, required this.rpm});
  int rpm;
  int temp;
}



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

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      create: (_) => SomeDataProvider(),
      lazy: false,
      child: MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
         colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
          useMaterial3: true,
        ),
        home: const MyHomePage(),
      ),
    );
  }
}
class MyHomePage extends StatelessWidget {
  const MyHomePage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        color: Colors.white30,
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
            
            //for displaying list length
              Selector<SomeDataProvider, List<Beaker>>(
                selector: (_,sd)=> sd.beakers,
                builder: (context, data, child)  {
                  de.log('Selector<Listprovider, List<Beaker>>: builder called for change in list');
                  return Text('${data.length}');
                  },
                ),
                
              // for building message
                Selector<SomeDataProvider, String>(
                  selector: (_, sd) => sd.message,
                  builder: (context, value, child) {
                    de.log('Selector<Listprovider, String>: builder called for message changed ');
                    return Text(value);},
                  ),
                

                ListenableBuilder(listenable: context.watch<SomeDataProvider>(),
                  builder: (context, child) {
                    de.log('ListenableBuilder: builder called');
                    return Text('${context.read<SomeDataProvider>().beakers.length}');
                  }),

                  TextButton(onPressed: (){
                    context.read<SomeDataProvider>().changemessage();
                  }, child: Text('button that will only change message')),

            ],
          ),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        child: const Icon(Icons.add),
        onPressed: (){
          context.read<SomeDataProvider>().addNewBeaker();
      }),
    );
  }
} 


Expected behavior
builder should be called only if results from selector are changed?
in this example when TextButton calls the changemessage method, builder function from the Selector that is not concerned with displaying message is also called or am I doing something wrong?

@UtkarshJagtap
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working needs triage
Projects
None yet
Development

No branches or pull requests

2 participants