Flutter可伸缩布局插件flutter_stretchable_widgets的使用
Flutter可伸缩布局插件flutter_stretchable_widgets的使用
flutter_stretchable_widgets
许多有趣且有用的组件,如选择器或可展开组件。
演示
请运行 <code>example/lib/main.dart</code>
查看更多演示。
1. StretchablePanelWidget
![](https://raw.githubusercontent.com/isaacselement/flutter_stretchable_widgets/master/example/resources/gif/20240111-181735.gif)
import 'package:flutter_stretchable_widgets/flutter_stretchable_widgets.dart';
...
[@override](/user/override)
Widget build(BuildContext context) {
return Stack(
children: [
/// 左上角的一个
Positioned(
left: 0,
right: 0,
top: 80,
child: StretchablePanelWidget(
triggerWidget: const Icon(Icons.add),
stretchWidget: Text('Hello world', style: TextStyle(color: Colors.grey.withAlpha(128))),
),
),
/// 右上角的一个
Positioned(
left: 0,
right: 0,
top: 80,
child: StretchablePanelWidget(
widgetsBuilder: (context, state) {
return state.isShowingTriggeredWidget ? const Icon(Icons.add) : const Text('Hello world');
},
),
),
],
);
}
...
2. TimeRangePickerView
![](https://raw.githubusercontent.com/isaacselement/flutter_stretchable_widgets/master/example/resources/gif/Kapture_2024-06-20.gif)
import 'package:flutter_stretchable_widgets/flutter_stretchable_widgets.dart';
...
void onPressEvent() {
/// 显示时间范围选择器
TimeRangePickerView.show(
context,
onChange: (startDateTime, endDateTime) {
print('ON CHANGE: startDateTime: $startDateTime, endDateTime: $endDateTime');
},
onConfirm: (startDateTime, endDateTime) {
print('ON CONFIRM: startDateTime: $startDateTime, endDateTime: $endDateTime');
},
);
}
...
特性与问题
请随时在 问题追踪器 中请求新功能和报告问题。
完整示例
以下是一个完整的示例,展示了如何使用 flutter_stretchable_widgets
插件。
// ignore_for_file: avoid_print
import 'package:example/view_factory.dart';
import 'package:flutter/material.dart';
import 'package:flutter_stretchable_widgets/flutter_stretchable_widgets.dart';
import 'package:intl/intl.dart';
void main() => runApp(const App());
class App extends StatefulWidget {
const App({super.key});
[@override](/user/override)
State<App> createState() => AppState();
}
class AppState extends State<App> {
[@override](/user/override)
Widget build(BuildContext context) {
return const MaterialApp(home: Scaffold(body: Home()));
}
}
class Home extends StatefulWidget {
const Home({super.key});
[@override](/user/override)
State<Home> createState() => HomeState();
}
class HomeState extends State<Home> {
Couple<DateTime>? changedTimeRange;
Couple<DateTime>? selectedTimeRange;
[@override](/user/override)
Widget build(BuildContext context) {
return Stack(
fit: StackFit.expand,
children: [
/// 左上角的一个
Positioned(
left: 0,
right: 0,
top: 80,
child: ViewFactory.createStretchableWidget(
isInitShowStretchWidget: false,
alignment: Alignment.centerLeft,
),
),
/// 右上角的一个
Positioned(
left: 0,
right: 0,
top: 80,
child: ViewFactory.createStretchableWidget(
isInitShowStretchWidget: false,
alignment: Alignment.centerRight,
isWrappedWithScrollView: true,
text: ViewFactory.textShort,
),
),
/// 左下角的一个
Positioned(
left: 0,
right: 0,
bottom: 80,
child: ViewFactory.createStretchableWidget(
isInitShowStretchWidget: true,
alignment: Alignment.centerLeft,
),
),
/// 右下角的一个
Positioned(
left: 0,
right: 0,
bottom: 80,
child: ViewFactory.createStretchableWidget(
isInitShowStretchWidget: false,
alignment: Alignment.centerRight,
isWrappedWithScrollView: true,
text: ViewFactory.textLong,
),
),
StatefulBuilder(
builder: (context, mSetState) {
String string4Display(Couple<DateTime>? timeScope) {
if (timeScope == null) return '';
DateFormat first = DateFormat('yyyy/MM/dd HH:mm');
DateFormat second = DateFormat('HH:mm');
return '${first.format(timeScope.first)}-${second.format(timeScope.last)}';
}
return Column(
mainAxisSize: MainAxisSize.min,
children: [
const SizedBox(height: 80),
CupertinoActionSheetButton(
title: '显示时间范围选择器',
onPressed: () async {
changedTimeRange = null;
mSetState(() {});
TimeRangePickerView.show(
context,
onChange: (startDateTime, endDateTime) {
print('CHANGE: startDateTime: $startDateTime, endDateTime: $endDateTime');
changedTimeRange = Couple<DateTime>(startDateTime, endDateTime);
mSetState(() {});
},
onConfirm: (startDateTime, endDateTime) {
print('CONFIRM: startDateTime: $startDateTime, endDateTime: $endDateTime');
selectedTimeRange = Couple<DateTime>(startDateTime, endDateTime);
mSetState(() {});
},
);
},
),
Text(string4Display(changedTimeRange)),
const SizedBox(height: 16),
Text(
string4Display(selectedTimeRange),
style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
),
],
);
},
),
],
);
}
}
更多关于Flutter可伸缩布局插件flutter_stretchable_widgets的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter可伸缩布局插件flutter_stretchable_widgets的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter中使用flutter_stretchable_widgets
插件来实现可伸缩布局的示例代码。
首先,确保你已经在pubspec.yaml
文件中添加了flutter_stretchable_widgets
依赖:
dependencies:
flutter:
sdk: flutter
flutter_stretchable_widgets: ^latest_version # 请替换为最新版本号
然后,运行flutter pub get
来安装依赖。
接下来,你可以在你的Flutter应用中使用StretchableBox
来实现可伸缩布局。以下是一个完整的示例代码:
import 'package:flutter/material.dart';
import 'package:flutter_stretchable_widgets/flutter_stretchable_widgets.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Stretchable Widgets Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: StretchableBoxDemo(),
);
}
}
class StretchableBoxDemo extends StatefulWidget {
@override
_StretchableBoxDemoState createState() => _StretchableBoxDemoState();
}
class _StretchableBoxDemoState extends State<StretchableBoxDemo> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Stretchable Box Demo'),
),
body: Center(
child: StretchableBox(
// 背景内容(不会被拉伸)
background: Container(
color: Colors.grey[200],
child: Center(
child: Text(
'Background Content',
style: TextStyle(color: Colors.black),
),
),
),
// 可拉伸内容(会被拉伸)
stretchableContent: Container(
color: Colors.blue.withOpacity(0.5),
child: Center(
child: Text(
'Stretchable Content',
style: TextStyle(color: Colors.white),
),
),
),
// 可拉伸区域的垂直方向最小高度和最大高度
minHeight: 100,
maxHeight: 300,
// 可拉伸区域的水平方向最小宽度和最大宽度
minWidth: 100,
maxWidth: double.infinity,
// 拉伸方向,可以是Axis.horizontal或Axis.vertical
axis: Axis.vertical,
),
),
);
}
}
在这个示例中,我们创建了一个StretchableBox
,其中包含背景内容和可拉伸内容。背景内容在拉伸时保持不变,而可拉伸内容会根据用户的交互进行拉伸。
background
属性定义了不会被拉伸的背景内容。stretchableContent
属性定义了会被拉伸的内容。minHeight
和maxHeight
属性定义了可拉伸区域在垂直方向的最小和最大高度。minWidth
和maxWidth
属性定义了可拉伸区域在水平方向的最小和最大宽度。axis
属性定义了拉伸的方向,可以是垂直方向(Axis.vertical
)或水平方向(Axis.horizontal
)。
这个示例展示了如何使用flutter_stretchable_widgets
插件来创建一个简单的可伸缩布局。你可以根据需要调整属性以实现更复杂的布局效果。