搜索插件、代码仓与 APP 分类

插件详情v0.0.21

master_utility

集尺寸、导航、图像选择器、日期时间、自动调整文本大小、提示、电子邮件、日志、对话框、缓存图像、验证、API 和共享偏好设置于一体的全能实用工具解决方案。

AndroidiOS
近 30 天下载
111
喜欢数
44
Pub 分数
80

安装插件

flutter pub add master_utility

插件介绍

基于插件公开信息、社区数据与项目使用情况整理的选型参考。

Master_Utility 是一个全面的 Flutter 包,提供了一站式解决方案,涵盖各种基本实用工具。它通过提供屏幕尺寸调整、导航、图像选择、日期和时间处理、自动调整文本大小、弹出消息、电子邮件集成、日志记录、对话框管理、缓存图像加载、表单验证、API 调用以及共享偏好设置等工具,简化了开发流程。该包旨在提高效率,减少样板代码,并加速 Android 和 iOS 平台上的应用开发。对于希望使用统一工具包来简化常见任务而不依赖多个独立包的开发者来说,这是一个理想选择。

适合场景

  • 快速原型设计
  • 跨平台移动开发
  • 简化用户界面和状态管理
  • 简化表单验证
  • 高效的数据持久化
  • 统一的工具访问

主要特点

  • 一站式实用工具包
  • 内置导航辅助功能
  • 图像缓存和选择器
  • 自动调整文本小部件大小
  • Toast 和对话框组件
  • 共享首选项和API集成

适合对象

  • 初学者到高级的Flutter开发者
  • 需要快速设置的应用
  • 频繁进行UI和数据操作的项目
  • 致力于减少依赖项泛滥的团队
  • 注重开发速度的开发者

使用建议

  • 可能包含简单应用的未使用功能
  • 捆绑工具可能带来的尺寸开销
  • 某些模块的自定义功能有限
  • 依赖外部依赖项以实现特定功能
  • 最适合需要广泛实用功能覆盖的项目

原始 README

以下为关联源码仓库的 README 原文快照,最新内容请访问源码仓库。

Master Utility Package

A package that enables you to use a comprehensive set of utilities in a single package with customization. It includes features like Done Keyboard View For Android and IOS, Size Helper, Navigation Helper, Image Picker Helper, Date Time Helper, Auto Size Text Helper, Toast Helper, Email Dispose, Log Helper, Dialog Helper, Cache Network Image Helper, Validation Helper, Api Helper, Shared Preference Helper,image cropper helper, Debounce helper, Read more Text Helper, duble click redundant Helper and Permission handler with custom type Helper.

Support

- Android
- iOS
How to add this package to your project add this dependencies inside your pubspec.yaml file
dependencies:
   master_utility :

Import Package

import 'package:master_utility/master_utility.dart';

Uses

For use this package

MasterUtilityMaterialApp()
Use this as a MaterialApp();
This package contains the below points as of now. We can improve and add new points as per requirements in the future

Done Keyboard View For Android and IOS

You need to add the below line into FocusNode, which you can manage with Custom Text Filed. You have the option to hide the done keyboard, and you can enable the previous and next buttons to focus on the next and previous fields.

focusNode: showDoneKeyboard
  ? (focusNode..addListener(() {
        final hasFocus = focusNode.hasFocus;
        if (hasFocus) {
        KeyboardOverlay.showOverlay(
            context: context,
            isNextButton: isNextButton,
            isPrevious: isPrevious,
            isShowButton: (isNextButton || isPrevious),
              );
            } else {
              KeyboardOverlay.removeOverlay();
            }
          })
  ): focusNode,

AppTextField(
    focusNode: focusNode,
    label: "TextField to View Done Keyboard",
    showDoneKeyboard: true, // by default done view is false
),

Navigation helper

NavigationHelper.navigatePop();

NavigationHelper.navigatePush(route: routeName());

NavigationHelper.navigatePushReplacement(route: routeName());

NavigationHelper.navigatePushRemoveUntil(route: routeName());

Sizer helper

add below line inside your first widget build method

SizeHelper.setMediaQuerySize();

Container(
    width: 0.03.w,    //It will take a 30% of screen width
    height:0.03.h,     //It will take a 30% of screen height
),

Padding(
    padding: EdgeInsets.symmetric(vertical: 0.05.h, horizontal: 0.05.w),
    child: Container(),
);

Text('Sizer Helper',style: TextStyle(fontSize: 5.5.fs));

Image picker helper

To use In [IOS] add this code in project_directory/ios/Runner/info.plist

`<key>`NSCameraUsageDescription `</key>`
    `<string>`Upload image from camera for screen background `</string>`
    `<key>`NSMicrophoneUsageDescription `</key>`
    `<string>`Post videos to profile `</string>`
    `<key>`NSPhotoLibraryUsageDescription `</key>`
    `<string>`Upload images for screen background `</string>`
  • Multimedia picker

    • Take Photo

    • Photo from Gallery

    • Take a Video

    • Video from Gallery

    • Document

      final result = await ImagePickerHelper.multiMediaPicker();

  • Custom media picker

    final result = await ImagePickerHelper.customMediaPicker( pickerActionType:PickerActionType.camera);

    use below enum for custom media picker PickerActionType.camera PickerActionType.gallery, PickerActionType.video, PickerActionType.cameraVideo, PickerActionType.document,

Date time helper

we have extension for on dateTime.

DateTime.now().toCustomFormatter(formatter:DateTimeFormatter.HOUR_MINUTE)

Auto size text helper

Widget AutoText AutoText({
    Key? key,
    Key? textKey,
    TextStyle? style,
    StrutStyle? strutStyle,
    double? minFontSize,
    double? maxFontSize,
    List`<double>`? presetFontSizes,
    AutoSizeGroup? group,
    TextAlign? textAlign,
    TextDirection? textDirection,
    Locale? locale,
    bool? softWrap,
    bool wrapWords = true,
    TextOverflow? overflow,
    Widget? overflowReplacement,
    double? textScaleFactor,
    int? maxLines,
    String? semanticsLabel,
    required String text,
    TextSpan? textSpan,
})

Toast helper

Method : 1

showToast({required String message})

Method : 2

void showCustomToast({
        required String message,
        Color? backgroundColor,
        Color? textColor,
        double? fontSize,
        ToastGravity? gravity,
    })

Email Dispose helper

void getEmailDisposeHelper() async {
    final EmailDisposerResModel? result = await EmailDisposeHelper.emailDisposerChecker(email: “fredrik.eilesartsen@yopmail.com”);
    LogHelper.logInfo(“Is Email Disposable? : ${result?.disposable}“);
}

Log helper

LogHelper.logInfo("add log here");

LogHelper.logSuccess("add log here");

LogHelper.logWarning("add log here");

LogHelper.logError("add log here");

Dialog Helper

Show Action Sheet

final PickerActionType? actionType = await DialogHelper.showActionSheet`<PickerActionType>`(
    actions: const [
        SheetAction(key: PickerActionType.camera, label: AppStrings.camera),
        SheetAction(key: PickerActionType.gallery, label: AppStrings.gallery),
    ],
);

Show Dialog

void _showDialogBox() {
    return DialogHelper.showCustomAlertDialog(
       barrierDismissible: false,
       builder: (BuildContext context, widget) {
       return WillPopScope(
        onWillPop: () async => false,
        child: AlertDialog(
          title: const Text(AppStrings.noInternet),
          content: const Text(AppStrings.checkYourInternet),
          contentPadding: EdgeInsets.all(AppPadding.p15),
          titlePadding: EdgeInsets.all(AppPadding.p15),
          actions: [
            AppButton(
              width: AppWidth.w140,
              title: AppStrings.tryAgain,
            )
           ],
          ),
         );
    });
}

Cache network Image Helper

AppNetworkImage(
    url: imageUrl,
    errorWidget: (p0, p1, p2) =>
        Icon(Icons.error),
),

Validation helper

validator: (v) => ValidationHelper.validateEmail(v),

Api Helper

First of all, you want to add the below line to the main method.

dioClient.setConfiguration(APIEndpoints.baseUrl);

FOR GET API CALL

Future`<void>` getApiCall() async {
    final request = APIRequest(
        url: url,
        methodType: MethodType.GET,
    );

final response =
        await APIService().GetApiResponse(request, apiResponse: (dynamic data) {
        return Data.fromJson(data);
    });
    if (response.hasError) {
        ToastHelper.showCustomToast(
        backgroundColor: Colors.red,
        message: response.message.toString());
    } else {
        _newData = response.data;
    }
}

FOR POST API CALL

final request = APIRequest(
   url: url,
   methodType: MethodType.POST,
   params: reqParam,
);

FOR PUT API CALL

final request = APIRequest(
   url: url,
   methodType: MethodType.PUT,
   params: reqParam,
);

FOR DELETE API CALL

final request = APIRequest(
   url: url,
   methodType: MethodType.DELETE,
);

Shared Preference Helper

First of all, you want to add the below line to the main method.

Parameters:

  • encryptionKey: A required string parameter used as the key(32 character) for encrypting and decrypting stored data.

    await PreferenceHelper.init(encryptionKey: 'your-encryption-key');

This initialization method must be called before any other methods in the PreferenceHelper class to ensure that the shared preferences instance and encryption key are properly set.

For String SET and GET

await PreferenceHelper().setStringPrefValue(key: key, value: value);

String getValue = await PreferenceHelper().getStringPrefValue(key: key);

For bool SET and GET

await PreferenceHelper().setBoolPrefValue(key: key, value: value);

bool getValue = await PreferenceHelper().getBoolPrefValue(key: key);

For int SET and GET

await PreferenceHelper().setIntPrefValue(key: key, value: value);

int getValue = await PreferenceHelper().getIntPrefValue(key: key);

For double SET and GET

await PreferenceHelper().setDoublePrefValue(key: key, value: value);

double getValue = await PreferenceHelper().getDoublePrefValue(key: key);

For remove single value and clear all from Shared Preference

await PreferenceHelper().removePrefValue(key: key);

String getValue = await PreferenceHelper().clearAll();

Note : Use PreferenceHelper instead of PreferenceServiceHelper

image cropper Helper

croppedImage = await ImageCropperHelper.cropImage(imagePath: fileResult.path);

LogHelper.logInfo("croppedImage result $croppedImage");

Read more and less more text Helper

ReadMoreTextHelper(
    'Flutter is Google’s mobile UI open source framework to build high-quality native (super fast) interfaces for iOS and Android apps with the unified codebase.',
    trimLines: 2,
    colorClickableText: Colors.blue,
    trimMode: TrimMode.Line,
    trimCollapsedText: 'Show more',
    trimExpandedText: 'Show less',
    moreStyle: TextStyle(
    fontSize: 14, fontWeight: FontWeight.bold),
),

Debounce Timer with milliseconds option Helper

final debouncer = DebouncerHelper();

debouncer.run(() {
    /// add your code here
});

double clicked redundant Helper

ElevatedButton(
    onPressed: () {
        DoubleClickReduntHelper.handleDoubleClick();
        ToastHelper.showToast(message: "Default Toast");
    },
    child: const Text("Show Default Toast"),
)

Permission Handler Helper

PermissionHandlerService.handlePermissions(
    type: PermissionType.PHOTO,

/// You can pass custom Dialog
    permissionDeniedDialog: () {
       return showDialog(
            context: context,
            builder: (context) {
             return const AlertDialog(title: Text("Custom Dialog"));
                        },
                    );
                },
        callBack: () async {
             final fileResult = await ImagePickerHelper.customMediaPicker(
                                pickerActionType: PickerActionType.gallery,
                              );
            LogHelper.logInfo("result $fileResult");
            if (fileResult != null) {
                croppedImage.value =await ImageCropperHelper.cropImage(imagePath: fileResult.path);

LogHelper.logInfo("croppedImage result $croppedImage");
                              }
            },
    )

img

Using the Encryption Extension

This extension provides tools to encrypt map data using RSA and AES encryption algorithms. Below is a quick guide on how to utilize this functionality in your project:

  1. Load the Public Key: Ensure you load the public key before using the encryption methods. Call EncryptionService.loadPublicKey() to load the key from preferences.
  2. Encrypt Data: Extend a Map object with the MapEncryption extension and call the encrypted() method to encrypt its contents. This method generates a random secret key and IV, encrypts the map data with AES, and then encrypts the secret key with RSA.
  3. Access Encrypted Data: The encrypted() method returns a map containing:
    • encryptedData: The AES-encrypted map data in base64 format.
    • encryptedKey: The RSA-encrypted secret key in base64 format.
    • iv: The IV used for AES encryption in base64 format.

Example usage:

await EncryptionService.loadPublicKey(); Map<String, dynamic> myMap = {'key': 'value'}; Map<String, dynamic> encryptedMap = myMap.encrypted(); print(encryptedMap);

By following these steps, you can securely encrypt your map data using the provided extension.

API Service Documentation

Overview

This document provides details on the getResponseWithMapper function, which is responsible for handling API requests and responses efficiently using the Dio package in Flutter. It also includes examples of how to fetch user data using this API service.

getResponseWithMapper<T>

Description

The getResponseWithMapper function handles API requests and responses while supporting JSON mapping for both objects and lists.

Function Signature
Future<Either<ApiException, APIResponse<T>>> getResponseWithMapper<T>(
    APIRequest request, {
    FormData? formData,
    final JsonMapper<T>? jsonMapper,
    final ListJsonMapper<T>? listJsonMapper,
  })
Parameters
  • request: The API request containing the endpoint URL, method type, and other configurations.
  • formData (optional): Form data for requests requiring file uploads.
  • jsonMapper (optional): A function that maps a JSON object to a model class.
  • listJsonMapper (optional): A function that maps a JSON array to a list of model objects.
Behavior
  • Ensures that only one of jsonMapper or listJsonMapper is provided.
  • Maps response data to the corresponding model if a mapper function is provided.
  • Handles Dio errors (DioException) and general exceptions.
Error Handling
  • If a DioException is thrown, a detailed ApiException is returned.
  • If an unknown error occurs, a generic error message is returned.
Example Usage
Fetching a List of Users
Future<void> getUsers() async {
  final request = APIRequest(
    url: '/users',
    methodType: MethodType.GET,
  );
  final response = await APIService().getResponseWithMapper<List<UserModel>>(
    request,
    listJsonMapper: UserModel.fromList,
  );
  response.fold(
    (l) => //Exception
    (r) => //List<UserModel>
  );
}
Fetching a Single User
Future<void> getUser1() async {
  final request = APIRequest(
    url: '/users/1',
    methodType: MethodType.GET,
  );
  final response = await APIService().getResponseWithMapper<UserModel>(
    request,
    jsonMapper: UserModel.fromJson,
  );
  response.fold(
    (l) => //Exception,
    (r) => //UserModel,
  );
}

Notes

  • Always ensure that either jsonMapper or listJsonMapper is passed, but not both.
  • The function is designed to handle different API response types efficiently.
  • Proper error handling is included for a seamless user experience.

This function provides a robust and scalable approach to handling API calls in a Flutter application.

LOGARTE

Overview

Logarte is a powerful in-app console for Flutter that lets you monitor app logs, inspect network calls, and easily share debug info. Boost your development workflow with real-time insights, exportable logs, and seamless team collaboration.

Please check Logarte for more details

Configurations

dioClient.setConfiguration(AppEnv.baseUrl, logarteClient: logarte);


// enableFileLogger is mandatory to store logs in file

await LogHelper.setConfigurations(logarteClient: logarte, enableFileLogger: true);


// It will return logs file

final file = await LogHelper.getLogsFile();

所属分类

依赖

依赖清单 22 项

源码仓库

使用此插件的项目

暂无相关数据。