Flutter多视图分割插件multi_split_view的使用
Flutter多视图分割插件multi_split_view的使用
插件简介
Multi split view 是一个为Flutter提供的水平或垂直多分割视图小部件。它具有以下特性:
- 支持水平和垂直布局
- 每个子视图可以配置flex或固定大小
- 高度可定制化
- 提供推动分隔条功能
你可以通过这个链接了解更多。
示例代码
下面是一个完整的示例,演示了如何使用multi_split_view
创建一个多视图应用:
import 'dart:math';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:multi_split_view/multi_split_view.dart';
void main() => runApp(const MultiSplitViewExampleApp());
class MultiSplitViewExampleApp extends StatelessWidget {
const MultiSplitViewExampleApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MultiSplitViewExample(),
);
}
}
class MultiSplitViewExample extends StatefulWidget {
const MultiSplitViewExample({Key? key}) : super(key: key);
@override
MultiSplitViewExampleState createState() => MultiSplitViewExampleState();
}
class MultiSplitViewExampleState extends State<MultiSplitViewExample> {
final MultiSplitViewController _controller = MultiSplitViewController();
bool _pushDividers = false;
@override
void initState() {
super.initState();
_controller.areas = [
Area(data: _randomColor(), size: 600, min: 100),
Area(data: _randomColor(), flex: 1),
Area(data: _randomColor(), size: 150, min: 100),
Area(data: _randomColor(), size: 150, min: 100),
];
_controller.addListener(_rebuild);
}
@override
void dispose() {
super.dispose();
_controller.removeListener(_rebuild);
}
void _rebuild() {
setState(() {});
}
@override
Widget build(BuildContext context) {
Widget buttons = Container(
color: Colors.white,
padding: const EdgeInsets.all(8),
child: Wrap(
crossAxisAlignment: WrapCrossAlignment.center,
spacing: 10,
runSpacing: 10,
children: [
ElevatedButton(onPressed: _onAddFlexButtonClick, child: const Text('Add flex')),
ElevatedButton(onPressed: _onAddSizeButtonClick, child: const Text('Add size')),
ElevatedButton(
onPressed: _controller.areasCount != 0 ? _onRemoveFirstButtonClick : null,
child: const Text('Remove first')),
Checkbox(value: _pushDividers, onChanged: (newValue) => setState(() {
_pushDividers = newValue!;
})),
const Text("Push dividers")
]));
Widget? content;
if (_controller.areasCount != 0) {
MultiSplitView multiSplitView = MultiSplitView(
onDividerDragUpdate: _onDividerDragUpdate,
onDividerTap: _onDividerTap,
onDividerDoubleTap: _onDividerDoubleTap,
controller: _controller,
pushDividers: _pushDividers,
builder: (BuildContext context, Area area) => ColorWidget(
area: area, color: area.data, onRemove: _removeColor));
content = Padding(
padding: const EdgeInsets.all(16),
child: MultiSplitViewTheme(
data: MultiSplitViewThemeData(dividerPainter: DividerPainters.grooved2()),
child: multiSplitView));
} else {
content = const Center(child: Text('Empty'));
}
return Scaffold(
appBar: AppBar(title: const Text('Multi Split View Example')),
body: Column(children: [buttons, Expanded(child: content)]));
}
Color _randomColor() {
Random random = Random();
return Color.fromARGB(255, 155 + random.nextInt(100), 155 + random.nextInt(100), 155 + random.nextInt(100));
}
_onDividerDragUpdate(int index) {
if (kDebugMode) {
// print('drag update: $index');
}
}
_onRemoveFirstButtonClick() {
if (_controller.areasCount != 0) {
_controller.removeAreaAt(0);
}
}
_onDividerTap(int dividerIndex) {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
duration: const Duration(seconds: 1),
content: Text("Tap on divider: $dividerIndex"),
));
}
_onDividerDoubleTap(int dividerIndex) {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
duration: const Duration(seconds: 1),
content: Text("Double tap on divider: $dividerIndex"),
));
}
_onAddFlexButtonClick() {
_controller.addArea(Area(data: _randomColor()));
}
_onAddSizeButtonClick() {
_controller.addArea(Area(data: _randomColor(), size: 100));
}
void _removeColor(int index) {
_controller.removeAreaAt(index);
}
}
class ColorWidget extends StatelessWidget {
const ColorWidget({
Key? key,
required this.color,
required this.onRemove,
required this.area,
}) : super(key: key);
final Color color;
final Area area;
final void Function(int index) onRemove;
@override
Widget build(BuildContext context) {
List<Widget> children = [];
TextStyle textStyle = const TextStyle(fontSize: 10);
if (area.size != null) {
children.add(Text('size: ${area.size!}', style: textStyle));
}
if (area.flex != null) {
children.add(Text('flex: ${area.flex!}', style: textStyle));
}
if (area.min != null) {
children.add(Text('min: ${area.min!}', style: textStyle));
}
if (area.max != null) {
children.add(Text('max: ${area.max!}', style: textStyle));
}
Widget info = Center(
child: Container(
color: const Color.fromARGB(200, 255, 255, 255),
padding: const EdgeInsets.fromLTRB(3, 2, 3, 2),
child: Wrap(
runSpacing: 5,
spacing: 5,
crossAxisAlignment: WrapCrossAlignment.center,
children: children)));
return InkWell(
onTap: () => onRemove(area.index),
child: Container(
color: color,
child: Stack(children: [const Placeholder(color: Colors.black), info])));
}
}
关键点解释
- 初始化:在
initState
方法中,我们初始化了一个MultiSplitViewController
控制器,并设置了几个初始区域(Area
),每个区域都有不同的属性如颜色、尺寸等。 - 按钮操作:提供了添加、移除区域的功能按钮,以及切换是否启用“推动分隔条”的复选框。
- 事件处理:定义了分隔条拖动更新、点击和双击事件的处理逻辑。
- 自定义组件:
ColorWidget
用于展示每个区域的颜色和其他信息,同时允许点击删除对应的区域。
这段代码展示了如何灵活地使用multi_split_view
插件来构建复杂的多视图界面。根据实际需求,你可以进一步调整和扩展这些功能。
更多关于Flutter多视图分割插件multi_split_view的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter多视图分割插件multi_split_view的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter中使用multi_split_view
插件来实现多视图分割的示例代码。multi_split_view
插件允许你在Flutter应用中创建可调整大小的分割视图布局。
首先,确保你已经在pubspec.yaml
文件中添加了multi_split_view
依赖:
dependencies:
flutter:
sdk: flutter
multi_split_view: ^最新版本号 # 请替换为实际最新版本号
然后,运行flutter pub get
来安装依赖。
接下来是一个简单的示例代码,展示如何使用multi_split_view
来创建两个可调整大小的视图:
import 'package:flutter/material.dart';
import 'package:multi_split_view/multi_split_view.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Multi Split View Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MultiSplitViewExample(),
);
}
}
class MultiSplitViewExample extends StatefulWidget {
@override
_MultiSplitViewExampleState createState() => _MultiSplitViewExampleState();
}
class _MultiSplitViewExampleState extends State<MultiSplitViewExample> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Multi Split View Example'),
),
body: MultiSplitViewControllerProvider(
initialChildren: [
MultiSplitViewItem(
id: 'view1',
initialSize: 0.5, // 初始大小占50%
child: Container(
color: Colors.red,
child: Center(
child: Text('View 1'),
),
),
),
MultiSplitViewItem(
id: 'view2',
initialSize: 0.5, // 初始大小占50%
child: Container(
color: Colors.blue,
child: Center(
child: Text('View 2'),
),
),
),
],
builder: (context, controller) {
return MultiSplitView(
controller: controller,
axis: Axis.horizontal, // 水平分割
children: controller.items.map((item) => item.child).toList(),
);
},
),
);
}
}
在这个示例中:
MultiSplitViewControllerProvider
用于创建并管理MultiSplitView
的控制器。MultiSplitViewItem
定义了每个分割视图的初始大小和子组件。MultiSplitView
使用控制器来管理分割视图的布局。
你可以根据需要调整initialSize
、axis
(可以是Axis.horizontal
或Axis.vertical
)以及每个分割视图的子组件。
这个示例展示了基本的用法,你可以根据实际需求进一步自定义和扩展。