Flutter分段控件插件material_segmented_control的使用
Flutter分段控件插件material_segmented_control的使用
Material Segmented Control
一个类似于iOS风格的Material设计分段控件。
为什么需要这个插件?
我们都很熟悉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
更多关于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),
),
],
),
),
);
}
}
代码解释
- 依赖导入:在
pubspec.yaml
文件中添加material_segmented_control
依赖。 - 创建应用:
MyApp
是一个无状态组件,它使用MaterialApp
来设置应用的主题和主页。 - 主页:
MyHomePage
是一个有状态组件,它包含一个MaterialSegmentedControl
和一个显示当前选中索引的Text
组件。 - 分段控件:
MaterialSegmentedControl
接受多个SegmentedControlOption
作为选项,每个选项都有一个标题和一个值。selectedIndex
属性表示当前选中的索引,onValueChanged
回调会在选项变化时被调用。 - 样式:你可以通过
activeColor
、inactiveColor
、borderColor
、borderWidth
、radius
等属性来设置分段控件的样式。unselectedLabelStyle
和selectedLabelStyle
允许你自定义未选中和选中标签的样式。
运行这个示例代码,你将看到一个包含三个选项的分段控件,并且每次点击选项时,下面的文本将更新为当前选中的索引。