Flutter实用工具插件easy_utils的使用

Flutter实用工具插件easy_utils的使用

插件介绍

easy_utils 是一个包含多个有用工具的 Flutter 包。只需要运行 flutter pub add easy_utils 即可将其添加到你的项目中。

功能特性

  • 简单发送 HTTP 请求(依赖于 http 库)。
  • 在无需上下文的情况下管理应用程序导航。
  • 即使在为 Web 平台编译相同代码时,也可以检查当前平台。
  • 更多功能…

EasyNav 使用指南

第一步

MaterialApp

MaterialApp 实例中添加 EasyNav.navigatorKey

[@override](/user/override)
Widget build(BuildContext context) {
  return MaterialApp(
    navigatorKey: EasyNav.navigatorKey,
    // 其他配置项
  );
}

CupertinoApp

CupertinoApp 实例中添加 EasyNav.navigatorKey

[@override](/user/override)
Widget build(BuildContext context) {
  return CupertinoApp(
    navigatorKey: EasyNav.navigatorKey,
    // 其他配置项
  );
}

使用示例

推送新路由

EasyNav.push(const MyScreen());

推送带有不可见名称的新命名路由

EasyNav.pushNamed(
  '/myRoute',
  // 隐藏路由名称
  invisibleName: true,
)

获取当前路由名称(即使不可见)

var routeName = EasyNav.getCurrentRouteName();

推送新路由并弹出其他路由

EasyNav.replace(const MyScreen());

推送新路由并弹出直到第一个路由

EasyNav.replaceUntil(
  const MyScreen(),
  predicate: (route) => route.isFirst,
);

弹出所有路由直到第一个路由

EasyNav.popUntilFirst();

弹出当前路由

EasyNav.pop();

更多详情请查看 src/navigation/nav_utils.dart 文件。

EasyHttp 使用指南

无需进行第一步,直接使用即可。

支持的 HTTP 方法

  • GET
  • HEAD
  • POST
  • PUT
  • DELETE
  • PATCH
  • 自定义请求类型(如 sendCUSTOM 方法)

使用示例

发送 GET 请求

EasyHttp.instance.sendGET('https://httpbin.org/get');

定义 API 前缀并发送 GET 请求

EasyHttp.instance.prefix = 'https://httpbin.org';
EasyHttp.instance.sendGET('/get');

发送自定义 HTTP 请求

EasyHttp.instance.sendCUSTOM(
  'https://example.com/myRoute',
  method: 'PROPATCH',
);

更多详情请查看 src/network/http_utils.dart 文件。

PlatformUtils 使用指南

以兼容的方式检查运行的操作系统,适用于 Web 平台。

使用示例

检查 Android 操作系统

import 'package:easy_utils/easy_utils.dart' as EasyUtils;

if (EasyUtils.isAndroid) {
  debugPrint('Hello from Android!');
}

更多详情请查看 src/platform 文件夹。

EasyDisplay 使用指南

检查显示特性,支持或不支持 BuildContext

使用示例

检查物理显示宽度

EasyDisplay.physicalWidth;

使用 BuildContext 检查平台亮度

EasyDisplay.create(context).platformBrightness;

使用 EasyNavappContext 检查黑暗模式是否启用

if (EasyDisplay.createFromAppContext().isDark) {
  debugPrint('Dark mode');
}

更多详情请查看 src/display/display_utils.dart 文件。

完整示例代码

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

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      navigatorKey: EasyNav.navigatorKey,
      debugShowCheckedModeBanner: false,
      title: 'Flutter Easy Utils Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      routes: {
        '/': (c) => MaterialHomePage(),
        '/second': (c) => MaterialSecondPage(),
      },
      initialRoute: '/',
    );
  }
}

class MaterialHomePage extends StatelessWidget {
  const MaterialHomePage();

  [@override](/user/override)
  Widget build(BuildContext context) => Scaffold(
        appBar: AppBar(
          centerTitle: false,
          title: Text(EasyNav.appTitle),
        ),
        body: SingleChildScrollView(
          child: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              crossAxisAlignment: CrossAxisAlignment.center,
              mainAxisSize: MainAxisSize.min,
              children: [
                ..._navigationUtils,
                SizedBox(height: 16),
                ..._httpUtils,
                SizedBox(height: 16),
                ..._getDisplayUtils(context),
                SizedBox(height: 16),
                ..._platformUtils,
              ],
            ),
          ),
        ),
      );

  List<Widget> get _navigationUtils => [
        Text('Navigator Utils'),
        SizedBox(height: 16),
        ElevatedButton(
          onPressed: () => EasyNav.pushNamed(
            '/second',
            // 默认值
            routeType: PageRouteType.DEFAULT_APP,
            arguments: 'BLABLABLA',
            invisibleName: true,
          ),
          child: Text('Open second page (App class)'),
        ),
        SizedBox(height: 16),
        ElevatedButton(
          onPressed: () => EasyNav.push(
            MaterialSecondPage(),
            routeType: PageRouteType.DEFAULT_OS,
          ),
          child: Text('Open second page (OS)'),
        ),
        SizedBox(height: 16),
        ElevatedButton(
          onPressed: () => EasyNav.push(
            MaterialSecondPage(),
            routeType: PageRouteType.MATERIAL,
          ),
          child: Text('Open second page (Material)'),
        ),
        SizedBox(height: 16),
        ElevatedButton(
          onPressed: () => EasyNav.push(
            MaterialSecondPage(),
            routeType: PageRouteType.CUPERTINO,
          ),
          child: Text('Open second page (Cupertino)'),
        ),
        SizedBox(height: 16),
        ElevatedButton(
          onPressed: () => EasyNav.push(
            MaterialSecondPage(),
            routeType: PageRouteType.FADE,
          ),
          child: Text('Open second page (Fade)'),
        ),
        SizedBox(height: 16),
        ElevatedButton(
          onPressed: () => EasyNav.push(
            MaterialSecondPage(),
            routeType: PageRouteType.SLIDE,
          ),
          child: Text('Open second page (Slide)'),
        ),
      ];

  List<Widget> _getDisplayUtils(BuildContext context) => [
        Text('Display Utils'),
        SizedBox(height: 16),
        Text(
            'Physical size: ${EasyDisplay.physicalWidth}x${EasyDisplay.physicalHeight}'),
        Text('Media query size (context): ${_getMediaQuerySize(context)}'),
        Text(
            'Media query size (navContext): ${_getMediaQuerySize(EasyNav.context)}'),
        Text(
            'Media query size (appContext): ${_getMediaQuerySize(EasyNav.appContext)}'),
        Text(
            'Media query size (focusContext): ${_getMediaQuerySize(EasyNav.focusContext!)}'),
      ];

  String _getMediaQuerySize(BuildContext context) {
    var mediaQuerySize = EasyDisplay.create(context).mediaQuery.size;
    return '${mediaQuerySize.width}x${mediaQuerySize.height}';
  }

  List<Widget> get _httpUtils => [
        Text('HTTP Utils'),
        SizedBox(height: 16),
        ElevatedButton(
          onPressed: () => EasyNav.push(MaterialHTTPPage()),
          child: Text('Open HTTP page'),
        ),
      ];

  List<Widget> get _platformUtils => [
        Text('Platform Utils'),
        SizedBox(height: 16),
        Text('Apple: $isApple (iOS: $isIOS - macOS: $isMacOS)'),
        Text('Google: $isGoogle (Android: $isAndroid - Fuchsia: $isFuchsia)'),
        Text(
            'Desktop: $isDesktop (Linux: $isLinux - MacOS: $isMacOS - Windows: $isWindows)'),
        Text('Mobile: $isMobile (Android: $isAndroid - iOS: $isIOS)'),
        Text('Web: $isWeb'),
      ];
}

class MaterialSecondPage extends StatelessWidget {
  const MaterialSecondPage();

  [@override](/user/override)
  Widget build(BuildContext context) {
    var routeName = EasyNav.getCurrentRouteName();
    var routeArgs = EasyNav.getCurrentRouteArguments();

    return Scaffold(
      appBar: AppBar(
        centerTitle: false,
        title: Text('Second page'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            Text('Example second page'),
            Text('Route name: $routeName'),
            Text('Route args: $routeArgs'),
          ],
        ),
      ),
    );
  }
}

class MaterialHTTPPage extends StatefulWidget {
  const MaterialHTTPPage();

  State<MaterialHTTPPage> createState() => _MaterialHTTPPageState();
}

class _MaterialHTTPPageState extends State<MaterialHTTPPage> {
  [@override](/user/override)
  void initState() {
    EasyHttp.instance.prefix = 'https://httpbin.org';
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) => Scaffold(
        appBar: AppBar(
          centerTitle: false,
          title: Text('HTTP page'),
          leading: IconButton(
            onPressed: EasyNav.pop,
            icon: Icon(Icons.arrow_back),
          ),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              FutureBuilder(
                future: EasyHttp.instance.sendPOST(
                  '/anything',
                  headers: {
                    'User-Agent': 'EasyUtils/Demo',
                    // 不使用 Content-Type 如果启用 sendBodyAsForm
                    'Content-Type': 'application/json; charset=utf-8'
                  },
                  body: <String, String>{
                    'app_name': 'easy_utils',
                  },
                ),
                builder: (context, snapshot) => Text(
                  snapshot.data?.body ??
                      snapshot.error?.toString() ??
                      'Loading...',
                  style: TextStyle(fontFamily: 'monospace'),
                ),
              ),
            ],
          ),
        ),
      );
}

更多关于Flutter实用工具插件easy_utils的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


当然,easy_utils 是一个在 Flutter 开发中非常实用的工具插件,它提供了一系列便捷的工具函数,可以简化开发流程。以下是一些关于如何使用 easy_utils 插件的代码示例。

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

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

然后运行 flutter pub get 来获取依赖。

1. 设备信息获取

easy_utils 提供了获取设备信息的功能,例如设备型号、系统版本等。

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String deviceInfo = '';

  @override
  void initState() {
    super.initState();
    _getDeviceInfo();
  }

  Future<void> _getDeviceInfo() async {
    DeviceInfo deviceInfo = await EasyUtils.deviceInfo();
    setState(() {
      this.deviceInfo = '设备型号: ${deviceInfo.model}\n系统版本: ${deviceInfo.version}';
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Device Info'),
        ),
        body: Center(
          child: Text(deviceInfo),
        ),
      ),
    );
  }
}

2. 屏幕截图

easy_utils 还可以方便地截取当前屏幕的内容。

import 'package:flutter/material.dart';
import 'package:easy_utils/easy_utils.dart';
import 'dart:typed_data';
import 'dart:ui' as ui;

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  Uint8List? screenshot;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Screenshot'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                onPressed: _captureScreenshot,
                child: Text('Capture Screenshot'),
              ),
              if (screenshot != null)
                Image.memory(screenshot!),
            ],
          ),
        ),
      ),
    );
  }

  Future<void> _captureScreenshot() async {
    RenderRepaintBoundary boundary =
        globalKey.currentContext!.findRenderObject()! as RenderRepaintBoundary;
    ui.Image image = await boundary.toImage();
    ByteData byteData = await image.toByteData(format: ui.ImageByteFormat.png);
    Uint8List pngBytes = byteData.buffer.asUint8List();
    setState(() {
      screenshot = pngBytes;
    });
  }

  final GlobalKey globalKey = GlobalKey();
}

注意:在上面的示例中,为了截取屏幕截图,你需要将你想要截取的 widget 包裹在一个 RepaintBoundary 中,并为其分配一个 GlobalKey。这里为了简化示例,省略了这部分代码,实际使用时请确保你的布局中包含 RepaintBoundary

3. 网络工具

easy_utils 还提供了网络工具,例如检查网络连接状态。

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String networkStatus = '';

  @override
  void initState() {
    super.initState();
    _checkNetworkStatus();
  }

  Future<void> _checkNetworkStatus() async {
    bool isConnected = await EasyUtils.isNetworkConnected();
    setState(() {
      networkStatus = isConnected ? '网络连接正常' : '网络已断开';
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Network Status'),
        ),
        body: Center(
          child: Text(networkStatus),
        ),
      ),
    );
  }
}

以上代码展示了如何使用 easy_utils 插件来获取设备信息、截取屏幕截图以及检查网络连接状态。你可以根据项目的实际需求,进一步探索和使用 easy_utils 提供的其他功能。

回到顶部