Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions analysis_options.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@

include: package:flutter_lints/flutter.yaml

# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options
linter:

rules:
avoid_print: true # Uncomment to disable the `avoid_print` rule
55 changes: 30 additions & 25 deletions example/lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_simple_multiselect/flutter_simple_multiselect.dart';

Expand Down Expand Up @@ -38,22 +39,22 @@ class _MyHomePageState extends State<MyHomePage> {
final _formKey = GlobalKey<FormState>();

List<Map<String, dynamic>> testData = [
{"uuid": 1, "name": "Alfred Johanson"},
{"uuid": 2, "name": "Goran Borovic"},
{"uuid": 3, "name": "Ivan Horvat"},
{"uuid": 4, "name": "Bjorn Sigurdson"}
{'uuid': 1, 'name': 'Alfred Johanson'},
{'uuid': 2, 'name': 'Goran Borovic'},
{'uuid': 3, 'name': 'Ivan Horvat'},
{'uuid': 4, 'name': 'Bjorn Sigurdson'}
];

Future<List<Map<String, dynamic>>> searchFunction(query) async {
return testData.where((element) {
return element["name"].toLowerCase().contains(query.toLowerCase());
return element['name'].toLowerCase().contains(query.toLowerCase());
}).toList();
}

Future<List<Map<String, dynamic>>> searchFunctionAsync(query) async {
return Future.delayed(const Duration(seconds: 1), () {
return testData.where((element) {
return element["name"].toLowerCase().contains(query.toLowerCase());
return element['name'].toLowerCase().contains(query.toLowerCase());
}).toList();
});
}
Expand Down Expand Up @@ -83,21 +84,21 @@ class _MyHomePageState extends State<MyHomePage> {
children: <Widget>[
const Padding(
padding: EdgeInsets.only(bottom: 10),
child: Text("Static data multiselect")),
child: Text('Static data multiselect')),
_staticData(),
const Padding(
padding: EdgeInsets.only(bottom: 10, top: 20),
child: Text("Async data multiselect")),
child: Text('Async data multiselect')),
_asyncData(),
const Padding(
padding: EdgeInsets.only(bottom: 10, top: 20),
child: Text("Data single select")),
child: Text('Data single select')),
_staticSingleData(),
Padding(
padding: const EdgeInsets.symmetric(vertical: 16.0),
child: Center(
child: ElevatedButton(
child: Text("submit"),
child: const Text('submit'),
onPressed: () {
// Validate returns true if the form is valid, or false otherwise.
if (_formKey.currentState!.validate()) {}
Expand All @@ -123,9 +124,11 @@ class _MyHomePageState extends State<MyHomePage> {
borderRadius: 5,
borderSize: 1,
validator: (value) {
print("--- ${value}");
if (value == null || value == "") {
return "Required";
if (kDebugMode) {
print('--- $value');
}
if (value == null || value == '') {
return 'Required';
}
return null;
},
Expand All @@ -135,7 +138,7 @@ class _MyHomePageState extends State<MyHomePage> {
length: 1,
tagBuilder: (context, index) => SelectTag(
index: index,
label: selectedItems[index]["name"],
label: selectedItems[index]['name'],
onDeleted: (value) {
selectedItems.removeAt(index);
setState(() {});
Expand All @@ -150,12 +153,12 @@ class _MyHomePageState extends State<MyHomePage> {
selectedColor: Colors.white,
selectedTileColor: Colors.green,
dense: true,
title: Text(data["name"].toString()),
title: Text(data['name'].toString()),
onTap: () {
singleItem = existing ? null : data;

state.selectAndClose(data,
singleItem != null ? singleItem!["name"].toString() : "");
singleItem != null ? singleItem!['name'].toString() : '');
setState(() {});
}),
);
Expand Down Expand Up @@ -187,15 +190,15 @@ class _MyHomePageState extends State<MyHomePage> {
length: selectedItems.length,
tagBuilder: (context, index) => SelectTag(
index: index,
label: selectedItems[index]["name"],
label: selectedItems[index]['name'],
onDeleted: (value) {
selectedItems.removeAt(index);
setState(() {});
},
),
suggestionBuilder: (context, state, data) {
var existingIndex = selectedItems
.indexWhere((element) => element["uuid"] == data["uuid"]);
.indexWhere((element) => element['uuid'] == data['uuid']);
var selectedData = data;
return Material(
child: ListTile(
Expand All @@ -204,7 +207,7 @@ class _MyHomePageState extends State<MyHomePage> {
trailing: existingIndex >= 0 ? const Icon(Icons.check) : null,
selectedColor: Colors.white,
selectedTileColor: Colors.green,
title: Text(selectedData["name"].toString()),
title: Text(selectedData['name'].toString()),
onTap: () {
if (existingIndex >= 0) {
selectedItems.removeAt(existingIndex);
Expand Down Expand Up @@ -241,9 +244,11 @@ class _MyHomePageState extends State<MyHomePage> {
resetTextOnSubmitted: true,
minTextFieldWidth: 300,
validator: (value) {
print("--- ${selectedItemsAsync.length}");
if (kDebugMode) {
print('--- ${selectedItemsAsync.length}');
}
if (selectedItemsAsync.length < 2) {
return "Min 2 items required";
return 'Min 2 items required';
}
return null;
},
Expand All @@ -252,26 +257,26 @@ class _MyHomePageState extends State<MyHomePage> {
isLoading: isLoading,
tagBuilder: (context, index) => SelectTag(
index: index,
label: selectedItemsAsync[index]["name"],
label: selectedItemsAsync[index]['name'],
onDeleted: (value) {
selectedItemsAsync.removeAt(index);
setState(() {});
},
),
suggestionBuilder: (context, state, data) {
var existingIndex = selectedItemsAsync
.indexWhere((element) => element["uuid"] == data["uuid"]);
.indexWhere((element) => element['uuid'] == data['uuid']);
var selectedData = data;
return Material(
child: ListTile(
selected: existingIndex >= 0,
trailing: existingIndex >= 0 ? const Icon(Icons.check) : null,
selectedColor: Colors.white,
selectedTileColor: Colors.green,
title: Text(selectedData["name"].toString()),
title: Text(selectedData['name'].toString()),
onTap: () {
var existingIndex = selectedItemsAsync.indexWhere(
(element) => element["uuid"] == data["uuid"]);
(element) => element['uuid'] == data['uuid']);
if (existingIndex >= 0) {
selectedItemsAsync.removeAt(existingIndex);
} else {
Expand Down
2 changes: 1 addition & 1 deletion lib/flutter_multiselect_layout.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ import './flutter_multiselect_layout_delegate.dart';
/// overrided [createRenderObject] to use custom [RenderCustomMultiChildLayoutBox]
class FlutterMultiselectLayout extends CustomMultiChildLayout {
FlutterMultiselectLayout({
Key? key,
required FlutterMultiselectLayoutDelegate delegate,
Key? key,
List<Widget> children = const <Widget>[],
}) : super(key: key, children: children, delegate: delegate);

Expand Down
6 changes: 4 additions & 2 deletions lib/flutter_multiselect_layout_delegate.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';

/// This is the layout delegate that is used to layout the tags and the text field.
/// It is used in [FlutterMultiselectLayout]
class FlutterMultiselectLayoutDelegate extends MultiChildLayoutDelegate {
FlutterMultiselectLayoutDelegate(
{required this.length,
Expand Down Expand Up @@ -86,15 +88,15 @@ class FlutterMultiselectLayoutDelegate extends MultiChildLayoutDelegate {

var textFieldSize = Size.zero;

//* Layout the textbox
//* Layout the TextBox
if (hasChild(textFieldId)) {
final currentRowWidth = tagSizes.fold<double>(0, (result, tag) {
return result + tag.width;
});
final spacingWidth = spacing * max(tagSizes.length - 1, 0);
final leftOverWidth = size.width - currentRowWidth - spacingWidth;
final textWidth = max(leftOverWidth, minTextFieldWidth);
//* Check if Textbox is overflowing
//* Check if TextBox is overflowing
//* Check if overflowing
if (_isOverflow(
childWidth: textWidth,
Expand Down
2 changes: 1 addition & 1 deletion lib/flutter_multiselect_render_layout_box.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ import 'flutter_multiselect_layout_delegate.dart';
class FlutterMultiselectRenderLayoutBox
extends RenderCustomMultiChildLayoutBox {
FlutterMultiselectRenderLayoutBox({
List<RenderBox>? children,
required FlutterMultiselectLayoutDelegate delegate,
List<RenderBox>? children,
}) : super(children: children, delegate: delegate);

@override
Expand Down
Loading