Flutter轻量级提示插件oktoast的使用

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

Flutter轻量级提示插件oktoast的使用

oktoast 是一个用于Flutter应用的轻量级Toast(提示)插件,允许开发者轻松地在应用程序中显示自定义样式的提示信息。以下是关于如何使用 oktoast 插件的具体指南。

一、简介

  • GitHub 地址OpenFlutter/flutter_oktoast
  • Pub Package 版本pub package
  • 开源协议:Apache-2.0
  • 特性
    • 支持完全自定义样式。
    • 不需要 BuildContext 即可调用。
    • 提供了多种展示位置和动画效果的选择。

二、安装与配置

1. 添加依赖

首先,在项目的 pubspec.yaml 文件中添加 oktoast 作为依赖:

flutter pub add oktoast

2. 导入库文件

接着,在 Dart 文件顶部导入 oktoast 库:

import 'package:oktoast/oktoast.dart';

3. 包装你的App Widget

为了让 Toast 能够覆盖整个应用程序,并且可以在任何地方被调用而不需要传递 BuildContext,你需要将整个应用程序包裹在一个 OKToast 组件内。可以这样做:

OKToast(
  child: MaterialApp(
    // ...其他配置...
  ),
);

或者通过 MaterialAppbuilder 属性来实现:

MaterialApp(
  builder: (BuildContext context, Widget? widget) {
    return OKToast(child: widget);
  },
  // ...其他配置...
);

如果遇到 “No MediaQuery widget found” 错误,请尝试上述第二种方法。

三、基本用法

显示文本Toast

最简单的方式就是直接调用 showToast 方法并传入想要显示的文字内容:

showToast('content');

你还可以指定更多参数来自定义 Toast 的外观和行为,例如:

showToast(
  'Hello World!',
  duration: Duration(seconds: 2),
  position: ToastPosition.bottom,
  backgroundColor: Colors.black.withOpacity(0.8),
  radius: 13.0,
  textStyle: TextStyle(fontSize: 18.0),
);

显示自定义Widget

除了简单的文本外,你也可以创建更复杂的布局并通过 showToastWidget 来展示:

Widget customWidget = Center(
  child: ClipRRect(
    borderRadius: BorderRadius.circular(30.0),
    child: Container(
      width: 40.0,
      height: 40.0,
      color: Colors.grey.withOpacity(0.3),
      child: Icon(Icons.add, size: 30.0, color: Colors.green),
    ),
  ),
);

ToastFuture toastFuture = showToastWidget(
  customWidget,
  duration: Duration(seconds: 3),
  onDismiss: () {
    print("the toast dismiss");
  },
);

关闭所有Toast

如果你想一次性关闭所有的 Toast,可以调用 dismissAllToast 方法:

dismissAllToast();

每个 showToastshowToastWidget 返回的是一个 ToastFuture 对象,它提供了对单个 Toast 的控制能力,比如提前关闭某个特定的 Toast:

toastFuture.dismiss(); // 立即关闭该Toast

四、完整示例代码

下面是一个完整的 Demo 示例,展示了如何集成并使用 oktoast 插件:

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:oktoast/oktoast.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return buildApp();
  }

  Widget buildWrapperApp() {
    return OKToast(
      child: MaterialApp(
        title: 'Demo for OKToast',
        theme: ThemeData(primarySwatch: Colors.blue),
        home: const MyHomePage(),
      ),
    );
  }

  Widget buildApp() {
    return MaterialApp(
      home: const MyHomePage(),
      builder: (_, Widget? child) => OKToast(
        textStyle: const TextStyle(fontSize: 19.0, color: Colors.white),
        backgroundColor: Colors.grey,
        animationCurve: Curves.easeIn,
        animationDuration: const Duration(milliseconds: 200),
        duration: const Duration(seconds: 3),
        child: child!,
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

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

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

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

  void _showToast() {
    showToast(
      '$_counter',
      position: ToastPosition.bottom,
      backgroundColor: Colors.black.withOpacity(0.8),
      radius: 13.0,
      textStyle: const TextStyle(fontSize: 18.0, color: Colors.white),
    );

    showToast(
      '$_counter',
      duration: const Duration(milliseconds: 3500),
      position: ToastPosition.top,
      backgroundColor: Colors.black.withOpacity(0.8),
      radius: 3.0,
      textStyle: const TextStyle(fontSize: 30.0, color: Colors.white),
    );

    final Widget widget = Center(
      child: ClipRRect(
        borderRadius: BorderRadius.circular(30.0),
        child: Container(
          width: 40.0,
          height: 40.0,
          color: Colors.grey.withOpacity(0.3),
          child: const Icon(Icons.add, size: 30.0, color: Colors.green),
        ),
      ),
    );
    final ToastFuture toastFuture = showToastWidget(
      widget,
      duration: const Duration(seconds: 3),
      onDismiss: () {
        debugPrint('Toast has been dismissed.');
      },
    );

    Future<void>.delayed(const Duration(seconds: 2), () {
      toastFuture.dismiss();
    });
  }

  ToastFuture? _persistToast;

  void _showPersistToast() {
    _persistToast = showToastWidget(
      Center(
        child: ElevatedButton(
          onPressed: () => _persistToast?.dismiss(),
          child: const Text('Click this button to dismiss'),
        ),
      ),
      duration: Duration.zero,
      handleTouch: true,
    );
  }

  void _dismissToastSynchronously() {
    final ToastFuture toast = showToast('Synchronously dismiss');
    toast.dismiss();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Example for OKToast')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Center(
              child: Text('You have pushed the button this many times:'),
            ),
            Center(
              child: Text(
                '$_counter',
                style: const TextStyle(fontSize: 20.0, fontWeight: FontWeight.w600),
              ),
            ),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: ElevatedButton(
                onPressed: _showToast,
                child: const Text('Show toast'),
              ),
            ),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: ElevatedButton(
                onPressed: _showPersistToast,
                child: const Text('Show a persist toast'),
              ),
            ),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: ElevatedButton(
                child: const Text('Toast during pushing to a new page'),
                onPressed: () {
                  _showToast();
                  Navigator.push(
                    context,
                    MaterialPageRoute<void>(builder: (_) => const MyHomePage()),
                  );
                },
              ),
            ),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: ElevatedButton(
                onPressed: _dismissToastSynchronously,
                child: const Text('Synchronously dismiss toast'),
              ),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Add number',
        child: const Icon(Icons.add),
      ),
    );
  }
}

这段代码创建了一个包含多个按钮的应用界面,用户可以通过点击不同的按钮触发不同类型的 Toast 提示,包括普通文本提示、带自定义组件的提示以及持久性提示等。此外,还演示了如何同步地关闭 Toast 和处理页面跳转时的提示显示问题。

希望以上内容能够帮助你更好地理解和使用 oktoast 插件!如果你有任何疑问或需要进一步的帮助,请随时提问。


更多关于Flutter轻量级提示插件oktoast的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter轻量级提示插件oktoast的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用轻量级提示插件oktoast的代码案例。这个插件提供了一种简单的方法来显示提示信息,非常适合用于显示短暂的通知或消息。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加oktoast的依赖:

dependencies:
  flutter:
    sdk: flutter
  oktoast: ^3.0.0  # 请检查最新版本号

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

2. 导入插件

在你的Dart文件中导入oktoast插件:

import 'package:oktoast/oktoast.dart';

3. 初始化OkToast

在应用的顶层(通常是MaterialAppCupertinoApp的外部)初始化OkToast

void main() {
  runApp(
    OkToast(
      child: MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: MyHomePage(),
      ),
    ),
  );
}

4. 使用OkToast显示提示

现在你可以在任何地方使用OkToast.show方法来显示提示信息。例如,在一个按钮点击事件中:

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

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('OkToast Demo'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 显示成功提示
            OkToast.show(
              context: context,
              widget: Center(
                child: Text('操作成功!'),
              ),
              duration: Duration(seconds: 2), // 提示显示的时长
              position: ToastPosition.center, // 提示的位置
            );
          },
          child: Text('显示成功提示'),
        ),
      ),
    );
  }
}

5. 自定义提示样式

你还可以自定义提示的样式,例如背景颜色、文本颜色等:

OkToast.show(
  context: context,
  widget: Container(
    padding: EdgeInsets.all(16.0),
    decoration: BoxDecoration(
      color: Colors.green,
      borderRadius: BorderRadius.circular(8.0),
    ),
    child: Text(
      '自定义提示',
      style: TextStyle(color: Colors.white),
    ),
  ),
  duration: Duration(seconds: 3),
  position: ToastPosition.bottom,
);

6. 显示加载提示

oktoast还支持显示加载提示,非常适合在异步操作期间显示:

void showLoadingToast(BuildContext context) {
  final loadingToast = OkToast.loading(
    context: context,
    widget: Center(
      child: CircularProgressIndicator(),
    ),
  );
  
  // 模拟异步操作
  Future.delayed(Duration(seconds: 2), () {
    loadingToast.hide(); // 隐藏加载提示
    OkToast.show(
      context: context,
      widget: Center(
        child: Text('加载完成!'),
      ),
      duration: Duration(seconds: 2),
    );
  });
}

在你的按钮点击事件中调用showLoadingToast方法:

ElevatedButton(
  onPressed: () {
    showLoadingToast(context);
  },
  child: Text('显示加载提示'),
),

这样,你就可以在Flutter项目中使用oktoast插件来显示各种类型的提示信息了。希望这个代码案例能帮助你更好地理解和使用oktoast

回到顶部