Skip to content

suryavip/selection_controller

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

SelectionController

Tools to help manage selection state.

Example use case

You have User class like this:

class User { String id; String name; int age; String get ageGroup { if (age >= 0 && age <= 12) return 'child'; if (age >= 12 && age <= 18) return 'teen'; return 'adult';	} User({ required this.id; required this.name; required this.age;	}); }

And you have some Users as options:

List<User> users = [ User(id: 'u0', name: 'James', age: 24), // adult User(id: 'u1', name: 'Mike', age: 17), // teen User(id: 'u2', name: 'John', age: 16), // teen User(id: 'u3', name: 'Harry', age: 28), // adult User(id: 'u4', name: 'Kid', age: 12), // child ];

Then you can use SelectionController to contain and manage the selection state.

SelectionController<User> selection = SelectionController(	choosableOptions: users,	indexGetter: (user) => user.id, // options will be indexed by the user's id );

You can use provided methods to check and manipulate a user selected status:

selection.isSelected('u0'); // return true if James selected (check by index which is the user's id) selection.isSelected(users[0]); // return true if James selected (check by the actual User object) selection.select('u0'); // select James selection.select(users[0]); // also select James selection.unselect('u1'); // unselect Mike selection.unselect(users[1]); // also unselect Mike selection.toggle('u2'); // toggle John selection.toggle(users[2]); // also toggle John selection.selected; // to get all Users that currently selected.

You can check and manipulate multiple users too:

selection.isAllSelected; // return true if all users selected selection.isNoneSelected; // return true if no user selected selection.selectAll(); // select all users selection.unselectAll(); // unselect all users selection.toggleAll(); // unselect all users if all users are selected. Else, select all users.

Constraint

If you only allow 1 user to be selected at a time:

SelectionController<User> selection = SelectionController(	choosableOptions: users,	indexGetter: (user) => user.id,	mode: SelectionMode.single, // apply constraint that only allow 1 option selected at a time. ); selection.select('u0'); // select James selection.isSelected('u0'); // James: true selection.isSelected('u1'); // Mike: false selection.isSelected('u2'); // John: false ... selection.select('u1'); // select Mike. James automatically deselected. selection.isSelected('u0'); // James: false selection.isSelected('u1'); // Mike: true selection.isSelected('u2'); // John: false ...

If you need some kind of grouping and only allow selection on one group:

SelectionController<User> selection = SelectionController(	choosableOptions: users,	indexGetter: (user) => user.id,	groupNameGetter: (user) => user.ageGroup, // to generate group name from each options (users)	mode: SelectionMode.sameGroup, // apply constraint that only allow selected options to be on a same group (same age group in this case). ); selection.select('u0'); // select James selection.isSelected('u0'); // James: true selection.isSelected('u1'); // Mike: false selection.isSelected('u2'); // John: false selection.isSelected('u3'); // Harry: false ... selection.isGroupSelected('adult'); // true selection.isGroupSelected('teen'); // false selection.isGroupSelectedAll('adult'); // false selection.isGroupSelectedAll('teen'); // false selection.select('u3'); // select Harry. James still selected because Harry and James are on the same age group (adult). selection.isSelected('u0'); // James: true selection.isSelected('u1'); // Mike: false selection.isSelected('u2'); // John: false selection.isSelected('u3'); // Harry: true ... selection.isGroupSelected('adult'); // true selection.isGroupSelected('teen'); // false selection.isGroupSelectedAll('adult'); // true selection.isGroupSelectedAll('teen'); // false selection.select('u2'); // select John. James and Harry will automatically deselected since John is on teen age group. selection.isSelected('u0'); // James: false selection.isSelected('u1'); // Mike: false selection.isSelected('u2'); // John: true selection.isSelected('u3'); // Harry: false ... selection.isGroupSelected('adult'); // false selection.isGroupSelected('teen'); // true selection.isGroupSelectedAll('adult'); // false selection.isGroupSelectedAll('teen'); // false selection.select('u1'); // select Mike. John still selected because Mike and John are on the same age group (teen). selection.isSelected('u0'); // James: false selection.isSelected('u1'); // Mike: true selection.isSelected('u2'); // John: true selection.isSelected('u3'); // Harry: false ... selection.isGroupSelected('adult'); // false selection.isGroupSelected('teen'); // true selection.isGroupSelectedAll('adult'); // false selection.isGroupSelectedAll('teen'); // true

Select and unselect multiple group:

selection.selectGroup('adult'); // select all adult. selection.isGroupSelected('adult'); // true selection.isGroupSelectedAll('adult'); // true selection.unselectGroup('adult'); // unselect all adult. selection.isGroupSelected('adult'); // false selection.isGroupSelectedAll('adult'); // false

Additional methods: see API documentation.

About

Tools to help manage selection state

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages