Flutter系统级功能访问插件os_basecode的使用

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

Flutter系统级功能访问插件os_basecode的使用

基本功能

Failur 类

在仓库实现中使用 Failur 类来返回左侧类型。这包括以下几种类型:

  • ServerFailure
  • ConnectionFailure
  • CommonFailure
  • DatabaseFailure

示例代码:

Future<Either<Failure, List<PriceInfoEntity>>> fetchAllGroup() async {
  try {
    var result = await alertRemoteDataSource.fetchAllGroup();
    return Right(result.map((e) => e.toEntity()).toList());
  } on DatabaseException catch (e) {
    return Left(DatabaseFailure(e.message));
  } on ServerException {
    return const Left(ServerFailure("Your message here"));
  } on CommonException {
    return const Left(CommonFailure("Your message here"));
  } catch (e) {
    return const Left(DatabaseFailure("Your message here"));
  }
}

异常类

在数据源中使用异常类来抛出异常,并在仓库实现中捕获这些异常。

  • ServerException
  • DatabaseException
  • CommonException

示例代码:

Future<List<PriceInfo>> fetchAllGroup() async {
  try {
    Dio dio = Dio();
    var result = await dio.get(priceInfoURL);
    return priceInfoFromJson(result.data);
  } on DioError {
    throw ServerException();
  } catch (e) {
    throw DatabaseException();
    // common exception
    throw CommonException();
  }
}

客户端类

客户端类是一个自定义的 DIO 实现,可以用于设置 baseURLheadersshowLogging 等属性。

示例代码:

var client = Client(
  baseURL: "your_base_url",
  showLogging: true,
  headers: {},
  handleWhenUnauthorized: () {
    // 处理您的 401 异常
  }
)..init();

在数据源中使用客户端:

class GroupRemoteDataSourceImpl implements GroupRemoteDataSource {
  Dio dio;
  GroupRemoteDataSourceImpl(this.client);

  Future<List<PriceInfo>> fetchAllGroup() async {
    try {
      var result = await dio.get(priceInfoURL);
      return priceInfoFromJson(result.data);
    } on DioError {
      throw ServerException();
    } catch (e) {
      throw DatabaseException();
    }
  }
}

工具方法

抖动(debounce)

在 BLoC 转换器中使用抖动。

示例代码:

on<OnQueryBanner>((event, emit) async {
  // 您的 BLoC 代码
}, transformer: debounce(const Duration(milliseconds: 500)));

数字文本格式化器(NumericTextFormatter)

TextFormField 中使用 NumericTextFormatter

示例代码:

return TextFormField(
  controller: nominalController,
  inputFormatters: [
    FilteringTextInputFormatter.digitsOnly,
    NumericTextFormatter()   // 添加此处
  ],
  keyboardType: TextInputType.number,
);

格式化印尼盾(formatRupiah)

将数字转换为货币字符串。

示例代码:

var nominal = 1000;
var formatted = formatRupiah(nominal);
print(formatted); // Rp. 10.000

获取纯数字(getNumberOnly)

从货币字符串中提取纯数字。

示例代码:

var formatted = "Rp. 10.000";
var number = getNumberOnly(formatted);
print(number); // 10000

安装包列表

bloc: ^9.0.0
dartz: ^0.10.1
dio: ^5.7.0
equatable: ^2.0.5
flutter_animate: ^4.5.2
flutter_bloc: ^9.0.0
flutter_screenutil: ^5.9.3
font_awesome_flutter: ^10.8.0
get_it: ^8.0.3
go_router: ^14.6.2
google_fonts: ^6.2.1
path_provider: ^2.1.5
rxdart: ^0.28.0
shared_preferences: ^2.3.3
supercharged: ^2.1.1
intl: ^0.20.1
dio_cache_interceptor: ^3.5.1
dio_cache_interceptor_hive_store: ^4.0.0
pretty_dio_logger: ^1.4.0
fluttertoast: ^8.2.10

从 1.1.12 迁移到 1.1.13

之前版本:

Future<void> initSharedPref() async {
  locator.registerSingletonAsync<SharedPreferences>(
    () async => await SharedPreferences.getInstance(),
  );
}

void initLocator(){
  locator.registerFactory<Client>(() => Client(
    baseURL: "http://localhost.com",
    showLogging: true,
    headers: {},
    hitCacheOnErrorExcept: [500],
    handleOnError: (err, handler) {},
    handleOnRequest: (requestOptions) {},
    handleOnResponse: (response) {},
    handleWhenUnauthorized: () {
      print("401 Error From Dio");
    }).init());
}

void main(){
  await di.initSharedPref();
  await di.locator.allReady();
  if (!di.locator.allReadySync()) {
    throw Exception("There is not enough time to initialize injector");
  }
  di.initLocator();
}

现在版本:

Future<void> initSharedPref() async {
  locator.registerSingletonAsync<SharedPreferences>(
    () async => await SharedPreferences.getInstance(),
  );
}

void initLocator(){
  locator.registerFactory<Client>(() => Client(
    baseURL: "http://localhost.com",
    showLogging: true,
    headers: {},
    accessTokenKey: "access_token", // 添加 accessTokenKey
    hitCacheOnErrorExcept: [500],
    handleOnError: (err, handler) {},
    handleOnRequest: (requestOptions) {},
    handleOnResponse: (response) {},
    handleWhenUnauthorized: () {
      print("401 Error From Dio");
    });
  locator.registerFactory<Dio>(() => locator<Client>().dioService);
}

void main(){
  await di.initSharedPref();
  await di.locator.allReady();
  if (!di.locator.allReadySync()) {
    throw Exception("There is not enough time to initialize injector");
  }
  di.initLocator();
}

// 不要忘记将访问令牌存储到共享首选项
SharedPreferences pref = await SharedPreferences.getInstance();
pref.setString("access_token", value);

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

1 回复

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


在Flutter应用中,使用os_basecode插件可以访问系统级功能。以下是一个简单的代码示例,展示了如何使用该插件进行一些常见的系统级功能访问,比如获取设备信息、电池状态等。

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

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

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

接下来,在你的Dart代码中,你可以这样使用os_basecode插件:

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

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

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

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

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

  Future<void> _getDeviceInfo() async {
    try {
      final deviceInfo = await OSBasecode.deviceInfo();
      setState(() {
        this.deviceInfo = deviceInfo.toString();
      });
    } catch (e) {
      print("Error getting device info: $e");
    }
  }

  Future<void> _getBatteryLevel() async {
    try {
      final batteryStatus = await OSBasecode.batteryStatus();
      setState(() {
        this.batteryLevel = "${batteryStatus.level}%";
      });
    } catch (e) {
      print("Error getting battery level: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('OS Basecode Plugin Demo'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Text("Device Info:", style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
              Text(deviceInfo, style: TextStyle(fontSize: 16)),
              SizedBox(height: 20),
              Text("Battery Level:", style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
              Text(batteryLevel, style: TextStyle(fontSize: 16)),
            ],
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. pubspec.yaml中添加了os_basecode依赖。
  2. MyApp组件的initState方法中,调用了_getDeviceInfo_getBatteryLevel方法来获取设备信息和电池状态。
  3. OSBasecode.deviceInfo()方法用于获取设备信息,结果存储在deviceInfo字符串中。
  4. OSBasecode.batteryStatus()方法用于获取电池状态,结果存储在batteryLevel字符串中,特别是电池电量百分比。
  5. 在UI中使用Text组件展示获取到的设备信息和电池电量。

请注意,os_basecode插件的具体API可能会根据版本有所不同,请参考该插件的官方文档和示例代码,以确保代码的正确性和兼容性。如果插件提供了更多系统级功能,你可以按照类似的方式调用它们。

回到顶部