Home > database >  How to display the middle element of a list in Flutter?
How to display the middle element of a list in Flutter?

Time:06-04

I have a similar widget for CupertinoPicker, but it was made by hand. I need to make the middle element of the list be selected by default, not the initial one as it is now. I've tried different options but haven't been able to do it yet. Please tell me how to implement this, I will be grateful for the help?

widget

class WheelSpeedPicker extends StatefulWidget {
  final Function(dynamic) onValueChanged;
  final int? startPosition;
  final double itemSize;
  final double? listHeight;
  final int currentPosition;
  final double? listWidth;
  final FixedExtentScrollController? controller;

  const WheelSpeedPicker({
    Key? key,
    required this.onValueChanged,
    required this.currentPosition,
    required this.itemSize,
    this.startPosition,
    this.listHeight,
    this.controller,
    this.listWidth,
  }) : super(key: key);

  @override
  _WheelTimePickerState createState() {
    return _WheelTimePickerState();
  }
}

class _WheelTimePickerState extends State<WheelSpeedPicker> {
  FixedExtentScrollController? fixedExtentScrollController;
  int? currentPosition;

  @override
  void initState() {
    super.initState();
    currentPosition = widget.currentPosition;
    fixedExtentScrollController = widget.controller ??
        FixedExtentScrollController(initialItem: currentPosition ?? 0);
  }

  void _listener(int position) {
    setState(() {
      currentPosition = position;
    });
    widget.onValueChanged(currentPosition);
  }

 

CodePudding user response:


  @override
  void initState() {
    super.initState();
    // swap this
    // currentPosition = widget.currentPosition;
    // with this
    currentPosition = (time.length / 2).floor();
    fixedExtentScrollController = widget.controller ??
        FixedExtentScrollController(initialItem: currentPosition ?? 0);
  }

Other than that, I think your widget would be more useful if you added the items list to the widget parameters:


class WheelSpeedPicker extends StatefulWidget {
  final Function(dynamic) onValueChanged;
  final List<String> items;
  final int? startPosition;
  final double itemSize;
  final double? listHeight;
  final int currentPosition;
  final double? listWidth;
  final FixedExtentScrollController? controller;

  const WheelSpeedPicker({
    Key? key,
    required this.items,
    required this.onValueChanged,
    required this.currentPosition,
    required this.itemSize,
    this.startPosition,
    this.listHeight,
    this.controller,
    this.listWidth,
  }) : super(key: key);

And then you'd have a more coherent set of parameters, because you already have a startPosition in the interface.

@override
  void initState() {
    super.initState();
    currentPosition = widget.startPosition;
    fixedExtentScrollController = widget.controller ??
        FixedExtentScrollController(initialItem: startPosition ?? 0);
  }
  • Related