Flutter自定义空格键插件customizable_space_bar的使用

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

Flutter自定义空格键插件customizable_space_bar的使用

描述

customizable_space_bar 是一个Flutter插件,它允许你创建随滚动速率变化内容的AppBar。这使得实现 “Large Title” 类型的效果变得非常容易。

13063567123474

使用方法

此包主要用于与 SliverAppBarflexibleSpace: 一起使用,因此你需要使用 CustomScrollView

以下是使用该包的一个简单例子:

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

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

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

class MyHomePage extends StatelessWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: CustomScrollView(
        slivers: [
          SliverAppBar(
            pinned: true,
            leading: IconButton(
              icon: Icon(Icons.arrow_back_ios_sharp),
              onPressed: () {},
            ),
            backgroundColor: Theme.of(context).scaffoldBackgroundColor,

            /// The part you use this package
            flexibleSpace: CustomizableSpaceBar(
              builder: (context, scrollingRate) {
                return Padding(
                  padding: EdgeInsets.only(
                      bottom: 13, left: 12 + 40 * scrollingRate),
                  child: Align(
                    alignment: Alignment.bottomLeft,
                    child: Text(
                      "Hello World.",
                      style: TextStyle(
                          fontSize: 42 - 18 * scrollingRate,
                          fontWeight: FontWeight.bold),
                    ),
                  ),
                );
              },
            ),

            /// End of the part
            expandedHeight: 150,
          ),
          SliverList(
            delegate: SliverChildBuilderDelegate(
              (context, index) {
                return ListTile(
                  title: Text("LIST ITEM"),
                );
              },
            ),
          )
        ],
      ),
    );
  }
}

在这个例子中,我们创建了一个 CustomScrollView,其中包含一个 SliverAppBar 和一个 SliverListSliverAppBar 中的 flexibleSpace 使用了 CustomizableSpaceBar,当用户滚动时,builder 回调函数会根据 scrollingRate 参数来调整文本的位置和大小。

scrollingRate 是一个从 0.0 到 1.0 的值,表示 AppBar 的展开程度。当 AppBar 完全展开时,scrollingRate 为 0.0;当 AppBar 完全折叠时,scrollingRate 为 1.0。

如果你有任何问题或需求,可以在 GitHub 上提出。

13063658045969

希望这个插件能帮助你更轻松地实现动态的、响应式的 AppBar 效果!


更多关于Flutter自定义空格键插件customizable_space_bar的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter自定义空格键插件customizable_space_bar的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter中使用customizable_space_bar插件的一个示例代码案例。这个插件允许你自定义键盘空格键的行为和外观。首先,你需要确保在pubspec.yaml文件中添加该依赖项:

dependencies:
  flutter:
    sdk: flutter
  customizable_space_bar: ^最新版本号 # 请替换为实际发布的最新版本号

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

接下来,你可以在你的Flutter应用中创建一个自定义空格键。以下是一个完整的示例代码:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Customizable Space Bar Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: CustomizableSpaceBarExample(),
        ),
      ),
    );
  }
}

class CustomizableSpaceBarExample extends StatefulWidget {
  @override
  _CustomizableSpaceBarExampleState createState() => _CustomizableSpaceBarExampleState();
}

class _CustomizableSpaceBarExampleState extends State<CustomizableSpaceBarExample> {
  final TextEditingController _controller = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        Expanded(
          child: TextField(
            controller: _controller,
            decoration: InputDecoration(
              border: OutlineInputBorder(),
              labelText: 'Type something...',
            ),
            keyboardType: TextInputType.multiline,
            inputFormatters: [
              LengthLimitingTextInputFormatter(200), // 限制文本长度
            ],
            textInputAction: TextInputAction.done,
            keyboardOptions: KeyboardOptions(
              customActions: [
                CustomKeyboardAction(
                  key: 'send',
                  displayText: 'Send',
                  onPressed: () {
                    // 发送按钮的点击事件处理
                    print('Sending: $_controller.text');
                  },
                ),
              ],
            ),
            buildCounter: (context, {int? currentLength, int? maxLength, bool isFocused}) {
              return Padding(
                padding: const EdgeInsets.only(top: 8.0),
                child: Text(
                  '${currentLength ?? 0}/${maxLength ?? 0}',
                  style: TextStyle(color: Colors.grey),
                ),
              );
            },
          ),
        ),
        SizedBox(height: 16.0),
        CustomizableSpaceBar(
          key: UniqueKey(), // 确保每次构建时都使用唯一的key
          child: Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              IconButton(
                icon: Icon(Icons.emoji_emotions),
                onPressed: () {
                  // 表情按钮的点击事件处理
                  print('Emoji button pressed');
                },
              ),
              SizedBox(width: 16.0),
              Expanded(
                child: ElevatedButton(
                  onPressed: () {
                    // 发送/完成按钮的点击事件处理
                    print('Sending/Done: $_controller.text');
                  },
                  child: Text('Send'),
                ),
              ),
              SizedBox(width: 16.0),
              IconButton(
                icon: Icon(Icons.keyboard_voice),
                onPressed: () {
                  // 语音按钮的点击事件处理
                  print('Voice button pressed');
                },
              ),
            ],
          ),
          textInputConnection: _controller,
          options: CustomSpaceBarOptions(
            // 可选配置,例如自定义空格键的高度
            spaceBarHeight: 60.0,
            // 自定义背景颜色
            backgroundColor: Colors.blueGrey[100],
          ),
        ),
      ],
    );
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }
}

在这个示例中,我们创建了一个包含TextField和自定义空格键的页面。TextField用于输入文本,而CustomizableSpaceBar用于显示自定义的空格键布局。

  • CustomizableSpaceBarchild属性用于定义自定义空格键的布局,这里我们放置了三个按钮:一个表情按钮、一个发送按钮(使用ElevatedButton),以及一个语音按钮。
  • textInputConnection属性与TextEditingController绑定,这样自定义空格键的操作可以影响TextField
  • options属性允许你进一步自定义空格键的外观,例如高度和背景颜色。

这个示例展示了如何使用customizable_space_bar插件来自定义空格键的行为和外观。你可以根据自己的需求进一步调整代码。

回到顶部