Flutter自定义组件插件pal_widgets的使用

Flutter自定义组件插件 pal_widgets 的使用

pal_widgets 是一个用于增强Flutter应用中引导页(onboarding)功能的插件。它提供了多种引导小部件,可以让你的应用更容易上手。

安装插件

在你的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  pal_widgets: ^0.3.0

然后运行 flutter pub get 来安装该插件。

列表中的助手(Helpers)

名称 描述 状态
AnchoredHelper 通过圆形或矩形覆盖指定的小部件,并在其上方显示消息和按钮。

使用 AnchoredHelper

AnchoredHelper 受Google引导页启发,能够围绕你想要突出显示的小部件创建一个覆盖层,并在其上方显示消息和按钮。

示例代码

首先,在你的页面或应用根部嵌入 HelperOrchestrator 小部件。

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

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: HelperOrchestrator(
        child: MyHomePage(title: 'Flutter Demo Home Page'),
      ),
    );
  }
}

接下来,给需要作为锚点的小部件设置一个key。

Text(
  '$_counter',
  key: HelperOrchestrator.of(context).generateKey('text1'),
),

现在,你可以创建并显示一个 AnchoredHelper

final helper = AnchoredHelper(
  title: const Text('Title lorem pitume'),
  description: const Text('Lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum'),
  bgColor: Colors.blue,
  leftBtnText: const Text('cancel'),
  rightBtnText: const Text('Ok, understood'),
  onError: () => print("widget not found"),
  positivBtnStyle: helperOutlineBtnStyle,
  negativeBtnStyle: helperOutlineBtnStyle,
  onLeftBtnTap: () => HelperOrchestrator.of(context).hideHelper(),
  onRightTap: () => HelperOrchestrator.of(context).hideHelper(),
  onTapAnchor: () => HelperOrchestrator.of(context).hideHelper(),
);

// 显示带有'text1'键的锚定助手
HelperOrchestrator.of(context).showAnchoredHelper('text1', helper);

属性说明

  • title:标题文本。
  • description:描述文本。
  • bgColor:背景颜色(必填项)。
  • leftBtnText:左侧按钮文本。
  • rightBtnText:右侧按钮文本。
  • onLeftBtnTap:左侧按钮点击事件。
  • onRightTap:右侧按钮点击事件。
  • onError:错误处理函数。
  • leftBtnStyle:左侧按钮样式。
  • rightBtnStyle:右侧按钮样式。
  • onTapAnchor:点击锚点时的动作。
  • widgetFactory:创建锚定助手的工厂方法,默认是 AnchoredCircleHoleHelper.anchorFactory,也可以选择 AnchoredRectHoleHelper.anchorFactory

演示完整Demo

下面是一个完整的演示示例:

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

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const HelperOrchestrator(
        child: MyHomePage(title: 'Flutter Demo Home Page'),
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  ButtonStyle get helperOutlineBtnStyle => OutlinedButton.styleFrom(
        padding: const EdgeInsets.all(12),
        textStyle: const TextStyle(color: Colors.white, fontSize: 18),
        side: const BorderSide(width: 1.0, style: BorderStyle.solid, color: Colors.white),
        shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8.0)),
      );

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text('You have pushed the button this many times:'),
            Text(
              '$_counter',
              style: const TextStyle(color: Colors.blue, fontSize: 32),
            ),
            Text(
              'test widget helper',
              key: HelperOrchestrator.of(context).generateKey('text2'),
            ),
            const SizedBox(height: 21),
            OutlinedButton(
              onPressed: () {
                HelperOrchestrator.of(context).showAnchoredHelper('btn', helper);
              },
              child: const Text('push me 2'),
              key: HelperOrchestrator.of(context).generateKey('btn'),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }

  AnchoredHelper get helper => AnchoredHelper(
        title: const Text(
          'Push to increment',
          textAlign: TextAlign.center,
          style: TextStyle(color: Colors.white, fontSize: 32),
        ),
        description: const Text(
          'Tap on this button to increment the flutter demo counter',
          textAlign: TextAlign.center,
          style: TextStyle(color: Colors.white, fontSize: 21),
        ),
        bgColor: Colors.blue,
        rightBtnStyle: helperOutlineBtnStyle,
        leftBtnStyle: helperOutlineBtnStyle,
        onTapAnchor: () => HelperOrchestrator.of(context).hideHelper(),
        widgetFactory: AnchoredCircleHoleHelper.anchorFactory,
      );
}

这样,你就完成了一个简单的Flutter应用,它使用了 pal_widgets 插件来实现用户引导功能。


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

1 回复

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


当然,以下是如何在Flutter项目中自定义组件插件pal_widgets的一个示例。假设pal_widgets是一个已经发布在pub.dev上的Flutter插件,我们可以通过以下步骤来集成并使用它。如果pal_widgets是一个本地插件,步骤会稍有不同,但核心思路是一致的。

1. 添加依赖

首先,在pubspec.yaml文件中添加pal_widgets依赖:

dependencies:
  flutter:
    sdk: flutter
  pal_widgets: ^x.y.z  # 替换为实际的版本号

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

2. 导入并使用pal_widgets

在你的Dart文件中导入pal_widgets包,并使用其中的组件。以下是一个假设的示例,假设pal_widgets包含一个名为CustomButton的按钮组件。

import 'package:flutter/material.dart';
import 'package:pal_widgets/pal_widgets.dart';  // 导入pal_widgets包

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

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

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('使用pal_widgets示例'),
      ),
      body: Center(
        child: CustomButtonExample(),
      ),
    );
  }
}

class CustomButtonExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 假设CustomButton是pal_widgets中的一个组件
    return CustomButton(
      onPressed: () {
        // 按钮点击事件处理
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('按钮被点击了!')),
        );
      },
      child: Text('点击我'),
      // 假设CustomButton接受一些自定义属性,如颜色、大小等
      color: Colors.blue,
      fontSize: 20,
    );
  }
}

3. 自定义组件(如果pal_widgets允许扩展)

如果pal_widgets允许通过扩展来自定义组件,你可能需要创建一个新的Widget并在其内部使用pal_widgets的组件。以下是一个如何扩展自定义组件的示例:

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

class MyCustomButton extends StatelessWidget {
  final VoidCallback onPressed;
  final String label;
  final Color buttonColor;
  final double fontSize;

  const MyCustomButton({
    Key? key,
    required this.onPressed,
    required this.label,
    this.buttonColor = Colors.blue,
    this.fontSize = 18,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return InkWell(
      onTap: onPressed,
      child: Container(
        decoration: BoxDecoration(
          color: buttonColor,
          borderRadius: BorderRadius.circular(8),
        ),
        padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
        child: Text(
          label,
          style: TextStyle(fontSize: fontSize, color: Colors.white),
        ),
      ),
    );
    // 注意:这里我们直接使用了一个InkWell和Container来模拟自定义按钮,
    // 如果pal_widgets中的CustomButton提供了足够的自定义能力,
    // 你应该直接使用它并传递相应的参数。
    // 例如:
    // return CustomButton(
    //   onPressed: onPressed,
    //   child: Text(label, style: TextStyle(fontSize: fontSize)),
    //   color: buttonColor,
    // );
  }
}

在上面的示例中,MyCustomButton是一个自定义按钮,它使用了Flutter的基础组件(InkWellContainer)来模拟一个按钮。如果pal_widgets中的CustomButton提供了足够的自定义选项,你应该直接使用CustomButton并传递参数,而不是自己实现一个按钮。

请注意,由于pal_widgets是一个假设的包,具体的组件名称和API可能会有所不同。你需要参考pal_widgets的官方文档或源代码来了解其具体的用法和API。

回到顶部