Flutter可伸缩布局插件flutter_stretchable_widgets的使用

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

Flutter可伸缩布局插件flutter_stretchable_widgets的使用

flutter_stretchable_widgets

pub package

许多有趣且有用的组件,如选择器或可展开组件。

演示

请运行 <code>example/lib/main.dart</code> 查看更多演示。

1. StretchablePanelWidget

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

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

1 回复

更多关于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属性定义了会被拉伸的内容。
  • minHeightmaxHeight属性定义了可拉伸区域在垂直方向的最小和最大高度。
  • minWidthmaxWidth属性定义了可拉伸区域在水平方向的最小和最大宽度。
  • axis属性定义了拉伸的方向,可以是垂直方向(Axis.vertical)或水平方向(Axis.horizontal)。

这个示例展示了如何使用flutter_stretchable_widgets插件来创建一个简单的可伸缩布局。你可以根据需要调整属性以实现更复杂的布局效果。

回到顶部