使用滑块按钮创建分段控件小部件 - Flutter

Create a Segmented Control Widget with slider button - Flutter

如何创建类似的东西?:

演示:

我知道 flutter 有

CupertinoSegmentedControl()

但是这会创建类似于选项卡的东西,不会像内部带有按钮的开关那样滑动。

我发现的最好的东西是 CupertinoSlidingSegmentedControl():

class _ViewState extends State<View> {
  int segmentedControlGroupValue = 0;
  final Map<int, Widget> myTabs = const <int, Widget>{
    0: Text("Item 1"),
    1: Text("Item 2")
  };

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: CupertinoSlidingSegmentedControl(
          groupValue: segmentedControlGroupValue,
          children: myTabs,
          onValueChanged: (i) {
            setState(() {
              segmentedControlGroupValue = i;
            });
          }),
    );
  }
}

希望这对您有所帮助。请参阅文档 here.

我建议使用 CupertinoSlidingSegmentedControl Widget 以获得如上所示的输出

CupertinoSlidingSegmentedControl 小部件是一个 iOS 13 种样式的分段控件。它会在水平列表中显示 Mapchildren 中提供的小部件。用于select 多个相互排斥的选项之间。当分段控件中的一个选项被 selected 时,分段控件中的其他选项将不再被 selected。

可以选择使用自定义颜色创建分段控件。 thumbColorbackgroundColor 参数可用于覆盖分段控件的默认颜色。

创建优雅的分段控件,遵循此代码

import 'package:flutter/cupertino.dart';

 class SegmentedControl extends StatefulWidget {
   @override
   _SegmentedControlState createState() => _SegmentedControlState();
 }

class _SegmentedControlState extends State<SegmentedControl> {

  int segmentedControlValue = 0;

  Widget segmentedControl() {
    return Container(
      width: 300,
      child: CupertinoSlidingSegmentedControl(
          groupValue: segmentedControlValue,
          backgroundColor: Colors.blue.shade200,
          children: const <int, Widget>{
            0: Text('One'),
            1: Text('Two'),
            2: Text('Three')
          },
          onValueChanged: (value) {
            setState(() {
              segmentedControlValue = value;
            });
          }
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Segmented Control")),
      body: Padding(
        padding: const EdgeInsets.only(top: 30.0, left: 50),
        child: segmentedControl(),
      ),
    );
  }

}