I'm new to Dart and Flutter and I would like to know what do you think about this code and if it's any way that I could improve it :).
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Checked Listview',
theme: ThemeData(
primarySwatch: Colors.green,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key}) : super(key: key);
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: ToggleButtons(
selectedWidget: <Widget>[
Text("select_1"),
Text("select_2"),
Text("select_3")
],
unselectedWidget: <Widget>[
Text("unselect_1"),
Text("unselect_2"),
Text("unselect_3")
],
onPressed: (elem, isSelected) {
if (isSelected) {
print(elem);
}
},
shouldBeJustOneSelected: true,
)),
);
}
}
class ToggleButtons extends StatefulWidget {
final List<Widget> selectedWidget;
final List<Widget> unselectedWidget;
final bool shouldBeJustOneSelected;
final Function(Widget widget, bool isSelected) onPressed;
ToggleButtons(
{Key key,
this.selectedWidget,
this.unselectedWidget,
this.shouldBeJustOneSelected,
this.onPressed})
: super(key: key);
_ToggleButtonsState createState() => _ToggleButtonsState();
}
class _ToggleButtonsState extends State<ToggleButtons> {
List<Widget> _originalButtons = List<Widget>();
List<Widget> _choosedButtons = List<Widget>();
@override
void initState() {
super.initState();
_choosedButtons = widget.unselectedWidget;
}
buildList() {
if (_originalButtons.isNotEmpty) {
_originalButtons.clear();
}
for (int i = 0; i < _choosedButtons.length; i++) {
_originalButtons.add(FlatButton(
child: _choosedButtons[i],
onPressed: () {
print(i);
rebuildList(i);
},
));
}
return _originalButtons;
}
List<Widget> deepCopyList(List<Widget> list) {
var newList = List<Widget>();
for (int i = 0; i < list.length; i++) {
newList.add(list[i]);
}
return newList;
}
List<Widget> deepCopyListElement(List<Widget> list, Widget elem, int ind) {
var newList = List<Widget>();
for (int i = 0; i < list.length; i++) {
if (i == ind) {
newList.add(elem);
} else {
newList.add(list[i]);
}
}
return newList;
}
void rebuildList(int ind) {
setState(() {
Widget newElement = _choosedButtons[ind] == widget.unselectedWidget[ind]
? widget.selectedWidget[ind]
: widget.unselectedWidget[ind];
bool isSelected =
_choosedButtons[ind] == widget.unselectedWidget[ind] ? true : false;
if (widget.shouldBeJustOneSelected) {
_choosedButtons = deepCopyList(widget.unselectedWidget);
}
_choosedButtons = deepCopyListElement(_choosedButtons, newElement, ind);
widget.onPressed(newElement, isSelected);
});
}
@override
Widget build(BuildContext context) {
return Row(
children: buildList(),
);
}
}
Just let me know if you think I can improve it in any way, thanks :D