Flutter分段控件插件material_segmented_control的使用

发布于 1周前 作者 nodeper 来自 Flutter

Flutter分段控件插件material_segmented_control的使用

Material Segmented Control

一个类似于iOS风格的Material设计分段控件。

Preview

为什么需要这个插件?

我们都很熟悉Flutter中的Cupertino风格的分段控件。但是在Material设计中没有类似的组件,所以作者创建了这个插件来弥补这一空缺。

你可以通过pub.dev查看和下载这个插件。

如何使用

引入插件

在你的pubspec.yaml文件中添加如下依赖:

dependencies: 
    material_segmented_control: ^5.0.1

然后在代码中导入:

import 'package:material_segmented_control/material_segmented_control.dart';

基本用法

下面是一个简单的示例,展示了如何创建并使用MaterialSegmentedControl

int _currentSelection = 0;

MaterialSegmentedControl(
    children: _children,
    selectionIndex: _currentSelection,
    borderColor: Colors.grey,
    selectedColor: Colors.redAccent,
    unselectedColor: Colors.white,
    selectedTextStyle: TextStyle(color: Colors.white),
    unselectedTextStyle: TextStyle(color: Colors.redAccent),
    borderWidth: 0.7,
    borderRadius: 32.0,
    disabledChildren: [3],
    onSegmentTapped: (index) {
      setState(() {
        _currentSelection = index;
      });
    },
);

Map<int, Widget> _children = {
  0: Text('Hummingbird'),
  1: Text('Kiwi'),
  2: Text('Rio'),
  3: Text('Telluraves')
};

功能特性

  • 取消所有选项的选择:将selectionIndex设置为null可以取消所有选项的选择。
  • 禁用某些选项:通过设置disabledChildren属性来指定哪些索引对应的选项是不可点击的。可以通过传递null或空列表来不使用此功能。

完整示例demo

以下是一个更完整的示例,包含了按钮用于切换禁用状态和取消选择的功能:

import 'dart:math';

import 'package:flutter/material.dart';
import 'package:material_segmented_control/material_segmented_control.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  int? _currentSelection = 0;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        useMaterial3: true,
      ),
      home: Scaffold(
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              MaterialSegmentedControl(
                children: _children,
                selectionIndex: _currentSelection,
                borderColor: Colors.grey,
                selectedColor: Colors.redAccent,
                unselectedColor: Colors.white,
                selectedTextStyle: TextStyle(color: Colors.white),
                unselectedTextStyle: TextStyle(color: Colors.redAccent),
                borderWidth: 0.7,
                borderRadius: 6.0,
                disabledChildren: _disabledIndices,
                verticalOffset: 8.0,
                onSegmentTapped: (index) {
                  setState(() {
                    _currentSelection = index;
                  });
                },
              ),
              SizedBox(
                height: 8,
              ),
              Row(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  ElevatedButton(
                    child: Text('Toggle disabled'),
                    onPressed: () {
                      // This is just an example on how disabled children work.
                      // A disabled index is determined randomly.
                      setState(() {
                        _disabledIndices.clear();
                        _disabledIndices.add(_randomInt());
                      });
                    },
                  ),
                  const SizedBox(width: 8),
                  ElevatedButton(
                    child: Text('Un-select all'),
                    onPressed: () => setState(() => _currentSelection = null),
                  ),
                ],
              ),
            ],
          ),
        ),
      ),
    );
  }

  Map<int, Widget> _children = {
    0: Text('Flutter'),
    1: Text('Dart'),
    2: Text('Desktop'),
    3: Text('Mobile'),
    4: Text('Web')
  };

  // Holds all indices of children to be disabled.
  // Set this list either null or empty to have no children disabled.
  List<int> _disabledIndices = [];

  int _randomInt() {
    return Random.secure().nextInt(_children.length);
  }
}

以上就是关于material_segmented_control插件的基本介绍和使用方法。希望对你有所帮助!如果你有任何问题或需要进一步的帮助,请随时提问。


更多关于Flutter分段控件插件material_segmented_control的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter分段控件插件material_segmented_control的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter中使用material_segmented_control插件的示例代码。这个插件允许你创建一个分段控件(类似于iOS的UISegmentedControl)。

首先,你需要在你的pubspec.yaml文件中添加这个插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  material_segmented_control: ^2.0.0  # 请注意版本号,根据实际情况调整

然后,运行flutter pub get来安装依赖。

下面是一个完整的示例代码,展示了如何使用material_segmented_control

import 'package:flutter/material.dart';
import 'package:material_segmented_control/material_segmented_control.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Segmented Control Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int selectedIndex = 0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Segmented Control Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            MaterialSegmentedControl<int>(
              options: [
                SegmentedControlOption(
                  title: 'Option 1',
                  value: 0,
                ),
                SegmentedControlOption(
                  title: 'Option 2',
                  value: 1,
                ),
                SegmentedControlOption(
                  title: 'Option 3',
                  value: 2,
                ),
              ],
              selectedIndex: selectedIndex,
              onValueChanged: (newValue) {
                setState(() {
                  selectedIndex = newValue;
                  // 你可以在这里添加更多的逻辑,比如更新UI或者处理数据
                  print('Selected Index: $newValue');
                });
              },
              activeColor: Colors.blue,
              inactiveColor: Colors.grey,
              borderColor: Colors.grey,
              borderWidth: 2.0,
              radius: 15.0,
              unselectedLabelStyle: TextStyle(fontSize: 14),
              selectedLabelStyle: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
            ),
            SizedBox(height: 20),
            Text(
              'Selected Index: $selectedIndex',
              style: TextStyle(fontSize: 20),
            ),
          ],
        ),
      ),
    );
  }
}

代码解释

  1. 依赖导入:在pubspec.yaml文件中添加material_segmented_control依赖。
  2. 创建应用MyApp是一个无状态组件,它使用MaterialApp来设置应用的主题和主页。
  3. 主页MyHomePage是一个有状态组件,它包含一个MaterialSegmentedControl和一个显示当前选中索引的Text组件。
  4. 分段控件MaterialSegmentedControl接受多个SegmentedControlOption作为选项,每个选项都有一个标题和一个值。selectedIndex属性表示当前选中的索引,onValueChanged回调会在选项变化时被调用。
  5. 样式:你可以通过activeColorinactiveColorborderColorborderWidthradius等属性来设置分段控件的样式。unselectedLabelStyleselectedLabelStyle允许你自定义未选中和选中标签的样式。

运行这个示例代码,你将看到一个包含三个选项的分段控件,并且每次点击选项时,下面的文本将更新为当前选中的索引。

回到顶部