3
\$\begingroup\$

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

\$\endgroup\$

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Browse other questions tagged or ask your own question.