You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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?
The text was updated successfully, but these errors were encountered:
Describe the bug
Selector widget is calling its builder every time
notifyListeners()
is called even if the selected value is not changedTo Reproduce
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?The text was updated successfully, but these errors were encountered: