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