Flutter资源管理插件res的使用

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

Flutter资源管理插件 res 的使用

res 是一个用于处理 Dart 中可能抛出错误的函数或 Future 的结果管理插件。它通过封装可能抛出异常的操作,提供了一种防止应用崩溃并优雅地处理错误的方式。

特性

  • 防止应用程序崩溃。

使用方法

包装一个可能抛出错误的函数

import 'dart:math';
import 'package:res/res.dart';

final result = Result.of(
  () {
    final n = Random().nextInt(10);

    if (n < 5) {
      throw RangeError(n);
    }

    return n;
  },
  error: (e, s) => e.toString(),
);

if (result.isError) {
  print('Caught an error: ${result.error}');
} else {
  print('Success: ${result.value}');
}

或者包装一个可能抛出错误的 Future

Future<void> demo() async {
  final result = await Result.ofFuture(
    functionThatCanThrowError(),
    error: (e, s) => e.toString(),
  );

  if (result.isError) {
    print('Caught an error: ${result.error}');
  } else {
    print('Success: ${result.value}');
  }
}

Future<int> functionThatCanThrowError() async {
  final n = Random().nextInt(10);

  if (n < 5) {
    throw RangeError(n);
  }

  return n;
}

或者手动捕获错误

Future<void> main() async {
  final result = await functionThatDoesNotThrow();

  if (result.isError) {
    print('Error');
  } else {
    print(result.value);
  }
}

Future<Result<int, String>> functionThatDoesNotThrow() async {
  try {
    return Result.ok(await functionThatCanThrowError());
  } catch (e, s) {
    return Result.err(e.toString() + s.toString());
  }
}

完整示例 Demo

下面是一个完整的示例,展示了如何使用 res 插件来处理多个异步操作链式调用时的错误处理:

// ignore_for_file: avoid_print

import 'dart:math';
import 'package:res/res.dart';

Future<int> functionThatCanThrowError() async {
  final n = Random().nextInt(10);

  if (n < 5) {
    throw RangeError(n);
  }

  return n;
}

Future<Result<int, String>> functionThatDoesNotThrow() async {
  try {
    return Result.ok(await functionThatCanThrowError());
  } catch (e, s) {
    return Result.err(e.toString() + s.toString());
  }
}

void main() async {
  // 链式调用 flatMap 处理多个 Future
  final result = await functionThatDoesNotThrow()
      .flatMap((_) => const Result.ok(0))
      .flatMap((_) => const Result.ok(0));

  if (result.isError) {
    print('Error occurred');
  } else {
    print('Final value: ${result.value}');
  }
}

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

1 回复

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


在Flutter开发中,管理应用资源(如图片、字符串、字体等)是一个常见的需求。flutter_genres 插件结合使用可以简化和自动化这一过程。尽管flutter_gen本身是一个更广泛使用的资源生成工具,但如果你特别提到res插件,可能是指一个自定义或较少见的库。不过,为了说明资源管理的最佳实践,这里我会展示如何使用flutter_gen来管理资源,并给出相关代码案例。

使用 flutter_gen 管理 Flutter 资源

1. 添加依赖

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

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

dev_dependencies:
  build_runner: ^x.y.z  # 请替换为最新版本号
  flutter_lints: ^x.y.z  # 代码分析插件,可选

2. 配置资源

pubspec.yaml中定义你的资源,比如图片和字符串:

flutter:
  assets:
    - assets/images/logo.png
    - assets/strings/en.json
  
  # 如果你有本地化资源,也可以这样配置
  localizations:
    - assets/strings/en.json
    - assets/strings/zh.json

3. 生成代码

在项目根目录下运行以下命令来生成资源访问代码:

flutter pub run build_runner build

这将在lib/generated目录下生成资源访问文件。

4. 使用生成的代码访问资源

假设你有一个图片资源logo.png和一个字符串资源文件en.json,内容如下:

// assets/strings/en.json
{
  "app_name": "My Flutter App"
}

你可以这样访问这些资源:

import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; // 本地化资源
import 'package:your_app/generated/assets.dart'; // 自动生成的资源文件

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: AppLocalizations.of(context)!.app_name, // 使用本地化字符串
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Resource Management'),
      ),
      body: Center(
        child: Image.asset(Assets.images.logo), // 使用图片资源
      ),
    );
  }
}

注意,对于本地化字符串,你还需要在MaterialApp中设置localizationsDelegatessupportedLocales

import 'package:flutter_localizations/flutter_localizations.dart';

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      localizationsDelegates: [
        AppLocalizations.delegate,
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      supportedLocales: [
        Locale('en'),
        Locale('zh'),
      ],
      // 其他代码...
    );
  }
}

总结

虽然帖子中提到的是res插件,但flutter_gen是一个广泛使用的、功能强大的资源管理工具。通过上述步骤,你可以轻松地在Flutter应用中管理和访问资源。如果你确实需要使用特定的res插件,请参考该插件的官方文档,因为不同的插件可能有不同的配置和使用方法。

回到顶部