Flutter多功能实用插件flustars的使用

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

Flutter多功能实用插件flustars的使用

简介

flustars 是一个Flutter常用的工具类库,依赖于Dart常用工具类库common_utils,并对其他第三方库进行了封装。它致力于为开发者提供简单易用的工具类,包含但不限于SharedPreferences Util、Screen Util、Directory Util、Widget Util和Image Util等。如果你有好的工具类欢迎PR。

安装与配置

在你的项目中添加flustars依赖,请修改pubspec.yaml文件:

dependencies:
  flustars: ^2.0.1
  
  # 如果需要使用sp_util,可以单独引用
  sp_util: ^2.0.3

然后执行flutter packages get来获取依赖。

主要功能模块

SpUtil - SharedPreferences工具类

SpUtil是单例"同步"SharedPreferences工具类,支持get传入默认值,支持存储对象及对象数组。

示例代码

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await SpUtil.getInstance();
  runApp(MyApp());
}

class MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
    // 存取基础类型
    SpUtil.putString("username", "Sky24n");
    String userName = SpUtil.getString("username");
    print("MyHomePage userName: " + userName);

    // 存储实体对象示例
    City city = City(name: "成都市");
    SpUtil.putObject("loc_city", city);
    
    City hisCity = SpUtil.getObj("loc_city", (v) => City.fromJson(v));
    print("City: " + (hisCity == null ? "null" : hisCity.toString()));
  }
}

ScreenUtil - 屏幕适配工具类

ScreenUtil提供了屏幕适配的功能,包括获取屏幕宽高、密度、状态栏高度等,并支持根据设计稿尺寸进行自动适配。

示例代码

import 'package:flustars/flustars.dart';

class MainPageState extends State<MainPage> {
  @override
  Widget build(BuildContext context) {
    double statusBar = ScreenUtil.getInstance().statusBarHeight;
    double width = ScreenUtil.getInstance().screenWidth;
    double height = ScreenUtil.getInstance().screenHeight;
    double density = ScreenUtil.getInstance().screenDensity;
    double adapterW = ScreenUtil.getInstance().getAdapterSize(360);

    return Scaffold(
      appBar: AppBar(title: Text('Flustars Demos')),
      body: Column(
        children: [
          Container(
            width: ScreenUtil.getInstance().getAdapterSize(360.0),
            height: 50,
            color: Colors.grey,
            child: Center(child: Text("已适配宽")),
          ),
        ],
      ),
    );
  }
}

DirectoryUtil - 目录操作工具类

DirectoryUtil用于创建和获取应用目录路径,如临时目录、文档目录等。

示例代码

await DirectoryUtil.getInstance();
String tempPath = DirectoryUtil.getTempPath(category: 'Pictures', fileName: 'demo', format: 'png');
print("tempPath: $tempPath");

String appDocPath = DirectoryUtil.getAppDocPath(category: 'Pictures', fileName: 'demo', format: 'png');
print("appDocPath: $appDocPath");

WidgetUtil - 组件操作工具类

WidgetUtil提供了监听Widget渲染状态、获取Widget宽高等功能。

示例代码

WidgetUtil widgetUtil = new WidgetUtil();
widgetUtil.asyncPrepare(context, true, (Rect rect) {
  // widget渲染完成。
});

Rect rect = WidgetUtil.getWidgetBounds(context);
Offset offset = WidgetUtil.getWidgetLocalToGlobal(context);

ImageUtil - 图片处理工具类

ImageUtil用于获取网络或本地图片尺寸。

示例代码

Rect rect1 = await WidgetUtil.getImageWH(image: Image.network("Url"));
Rect rect2 = await WidgetUtil.getImageWH(url: "Url");
Rect rect3 = await WidgetUtil.getImageWH(localUrl: "assets/images/3.0x/ali_connors.png");

完整示例Demo

以下是一个完整的示例程序,演示了如何使用flustars中的多个工具类。

import 'package:flustars/flustars.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

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

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

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
    _initAsync();

    setDesignWHD(360.0, 640.0, density: 3);
  }

  void _initAsync() async {
    await SpUtil.getInstance();

    SpUtil.putString("username", "sky24");
    String? userName = SpUtil.getString("username", defValue: "");
    LogUtil.e("userName: $userName");

    City city = City(name: "成都市");
    SpUtil.putObject("loc_city", city);

    City? hisCity = SpUtil.getObj(
        "loc_city", (v) => City.fromJson(v as Map<String, dynamic>));
    LogUtil.e("City: " + (hisCity == null ? "null" : hisCity.toString()));

    List<City> list = [];
    list.add(City(name: "成都市"));
    list.add(City(name: "北京市"));
    SpUtil.putObjectList("loc_city_list", list);

    List<City>? dataList = SpUtil.getObjList(
        "loc_city_list", (v) => City.fromJson(v as Map<String, dynamic>));
    LogUtil.e("CityList: " + (dataList == null ? "null" : dataList.toString()));
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MainPage(),
    );
  }
}

class MainPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return MainPageState();
  }
}

class MainPageState extends State<MainPage> {
  void test2() async {
    await DirectoryUtil.getInstance();
    String? tempPath = DirectoryUtil.getTempPath(
        category: 'Pictures', fileName: 'demo', format: 'png');
    LogUtil.e("tempPath: $tempPath");

    String? appDocPath = DirectoryUtil.getAppDocPath(
        category: 'Pictures', fileName: 'demo', format: 'png');
    LogUtil.e("appDocPath: $appDocPath");
  }

  @override
  Widget build(BuildContext context) {
    MediaQuery.of(context);

    double statusBar = ScreenUtil.getInstance().statusBarHeight;
    double width = ScreenUtil.getInstance().screenWidth;
    double height = ScreenUtil.getInstance().screenHeight;
    double density = ScreenUtil.getInstance().screenDensity;
    double sp = ScreenUtil.getInstance().getAdapterSize(24);
    double spc = ScreenUtil.getInstance().getAdapterSize(24);
    double adapterW = ScreenUtil.getInstance().getAdapterSize(360);

    LogUtil.e(
        "MainPage statusBar: $statusBar, width: $width, height: $height, density: $density, sp: $sp, spc: $spc, adapterW: $adapterW");
    return Scaffold(
      appBar: AppBar(
        title: const Text('Flustars Demos'),
        centerTitle: true,
      ),
      body: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: <Widget>[
          Container(
            width: 360.0,
            height: 50,
            color: Colors.grey,
            child: Center(
              child: Text(
                "未适配宽",
                style: TextStyle(fontSize: 24.0),
              ),
            ),
          ),
          Container(
            width: ScreenUtil.getInstance().getAdapterSize(360.0),
            height: 50,
            color: Colors.grey,
            child: Center(
              child: Text(
                "已适配宽",
                style: TextStyle(fontSize: 24.0),
              ),
            ),
          ),
        ],
      ),
    );
  }
}

class City {
  String name;

  City({required this.name});

  City.fromJson(Map<String, dynamic> json) : name = json['name'];

  Map<String, dynamic> toJson() => {
        'name': name,
      };

  @override
  String toString() {
    StringBuffer sb = StringBuffer('{');
    sb.write("\"name\":\"$name\"");
    sb.write('}');
    return sb.toString();
  }
}

通过上述代码,您可以快速上手并利用flustars提供的强大功能来简化您的开发工作。希望这些内容能帮助您更好地理解和使用flustars。如果有任何问题或建议,请随时联系作者Sky24n


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

1 回复

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


当然,Flutter 社区中 flustars 是一个非常实用的多功能插件,它提供了许多便捷的功能,比如设备信息获取、屏幕适配、本地化、共享偏好设置等。下面是一些关于如何使用 flustars 的代码示例。

首先,确保你已经在 pubspec.yaml 文件中添加了 flustars 依赖:

dependencies:
  flutter:
    sdk: flutter
  flustars: ^x.x.x  # 请替换为最新版本号

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

1. 获取设备信息

flustars 提供了 DeviceUtils 类来获取设备信息。

import 'package:flustars/flustars.dart';

void printDeviceInfo() {
  String brand = DeviceUtils.brand;
  String model = DeviceUtils.model;
  String systemVersion = DeviceUtils.systemVersion;
  bool isAndroid = DeviceUtils.isAndroid;
  bool isIOS = DeviceUtils.isIOS;
  
  print('Brand: $brand');
  print('Model: $model');
  print('System Version: $systemVersion');
  print('Is Android: $isAndroid');
  print('Is iOS: $isIOS');
}

2. 屏幕适配

flustars 提供了 ScreenUtil 类来进行屏幕适配。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 初始化ScreenUtil
    ScreenUtil.init(context, width: 750, height: 1334, allowFontScaling: true);
    
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Screen Util Demo'),
        ),
        body: Center(
          child: Text(
            'Screen Width: ${ScreenUtil().screenWidth} px\n'
            'Screen Height: ${ScreenUtil().screenHeight} px\n'
            'Text Size: ${ScreenUtil().setSp(24)}',
            style: TextStyle(fontSize: ScreenUtil().setSp(24)),
          ),
        ),
      ),
    );
  }
}

3. 本地化

flustars 提供了 LocalizationsUtils 类来简化本地化工作。

首先,创建 assets/i18n 目录,并在其中创建不同语言的 JSON 文件,比如 en.jsonzh.json

// assets/i18n/en.json
{
  "hello": "Hello"
}

// assets/i18n/zh.json
{
  "hello": "你好"
}

然后在代码中初始化并使用本地化:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 初始化LocalizationsUtils
    LocalizationsUtils.instance.init(
      context,
      keys: ['hello'],
      defaultLocale: Locale('en', 'US'),
      locales: [
        Locale('en', 'US'),
        Locale('zh', 'CN'),
      ],
    );
    
    return MaterialApp(
      supportedLocales: LocalizationsUtils.instance.locales,
      locale: LocalizationsUtils.instance.currentLocale,
      localizationsDelegates: [
        // 添加其他委托
        LocalizationsUtils.delegate,
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      home: Scaffold(
        appBar: AppBar(
          title: Text('Localization Demo'),
        ),
        body: Center(
          child: Text(LocalizationsUtils.instance.tr('hello')),
        ),
      ),
    );
  }
}

4. 共享偏好设置

flustars 提供了 SpUtil 类来简化共享偏好设置的操作。

import 'package:flustars/flustars.dart';

void saveAndRetrieveData() async {
  // 保存数据
  await SpUtil.putString('key_string', 'Hello, Flustars!');
  await SpUtil.putInt('key_int', 123);
  await SpUtil.putBool('key_bool', true);
  await SpUtil.putDouble('key_double', 45.67);

  // 检索数据
  String? stringValue = await SpUtil.getString('key_string');
  int? intValue = await SpUtil.getInt('key_int');
  bool? boolValue = await SpUtil.getBool('key_bool');
  double? doubleValue = await SpUtil.getDouble('key_double');

  print('String Value: $stringValue');
  print('Int Value: $intValue');
  print('Bool Value: $boolValue');
  print('Double Value: $doubleValue');
}

这些代码示例展示了如何使用 flustars 插件进行设备信息获取、屏幕适配、本地化和共享偏好设置等操作。你可以根据具体需求调整和扩展这些代码。

回到顶部