Flutter资源扫描插件assets_scanner_plus的使用

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

Flutter资源扫描插件assets_scanner_plus的使用

介绍

在Flutter中,你需要使用图片路径来加载图片,例如 AssetImage('graphics/background.png')。然而,这种方法容易出错,比如路径拼写错误,只有在程序运行后才能发现这种错误,并且通过路径可能无法直观地知道这是哪张图片。Assets Scanner可以帮助你为资源生成常量,减少拼写错误的概率。同时,你可以将鼠标悬停在常量上以更直观地预览图片。

使用方法

  1. 在你的 pubspec.yaml 文件中添加以下内容:
dev_dependencies:
    assets_scanner_plus: ^1.0.0
  1. 然后运行命令 flutter packages pub run build_runner buildassets_scanner_plus 会在 lib/ 目录下为你生成一个 r.dart 文件,如下所示:
/// GENERATED BY assets_scanner_plus. DO NOT MODIFY BY HAND.
/// See more detail on https://github.com/amorenew/assets_scanner_plus.
class R {
  static const package = "example";

  /// ![](.../assets_scanner_plus/example/assets/baseline_3d_rotation_white.png)
  static const baseline_3d_rotation_white = "assets/baseline_3d_rotation_white.png";

// ignore_for_file:lines_longer_than_80_chars,constant_identifier_names
}

注意:

  • 对于包资源,它会根据包名生成另一个类。
  • 如果资源名称不是合法的Dart标识符,非法字符会被转换成 _,例如资源名称 2TXsXk.jpg!w1280h1000.jpg 会生成属性名称 r_2TXsXk_jpg_w1280h1000

现在,你可以通过将鼠标悬停在常量上来预览图片资源:

资产预览

自定义 assets_scanner_plus_options.yaml

默认情况下,assets_scanner_plus 会在 lib/ 目录下生成 r.dart 文件,类名为 R 等。你可以通过添加一个 assets_scanner_plus_options.yaml 文件来自定义一些选项,支持的键列表如下:

  • path: r.dart 文件的位置路径。请注意,path 应该是 lib/ 的子路径。
  • className: r.dart 类的名称。
  • ignoreComment: 指示是否生成注释。请注意,如果 ignoreCommenttrue,则无法预览图片资源。

以下是 assets_scanner_plus_options.yaml 文件的示例:

# assets_scanner_plus_options.yaml

path: "lib/src"
className: "MainAssets"
ignoreComment: true

完整示例 Demo

下面是一个完整的示例,展示如何使用 assets_scanner_plus 插件:

// Copyright (C) 2024 amorenew
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import 'package:example/src/r.dart'; // 引入生成的 r.dart 文件
import 'package:flutter/material.dart';

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

// 忽略公共成员API文档
class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // 这个小部件是应用程序的根。
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        // 这是你的应用程序的主题。
        primarySwatch: Colors.blue,
      ),
      home: const Scaffold(
        backgroundColor: Colors.blue,
        body: SafeArea(
          child: Center(
            child: Column(
              children: <Widget>[
                Image(
                  image: AssetImage(R.alarm_white), // 使用生成的常量加载图片
                ),
                Image(
                  image: AssetImage(R.baseline_3d_rotation_white), // 使用生成的常量加载图片
                ),
                Image(
                  image: AssetImage(R.arrow_right_alt_white), // 使用生成的常量加载图片
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用assets_scanner_plus插件的详细代码示例。assets_scanner_plus插件可以帮助你自动扫描项目中的资源文件(如图片、音频等),并在运行时获取它们的路径信息。

1. 添加依赖

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

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

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

2. 配置资源文件

pubspec.yaml文件中配置你的资源文件,例如:

flutter:
  assets:
    - assets/images/
    - assets/audios/

3. 使用assets_scanner_plus插件

接下来,在你的Flutter项目中引入并使用assets_scanner_plus插件。以下是一个完整的示例代码:

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

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

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

class _MyAppState extends State<MyApp> {
  List<AssetEntity> _assets = [];

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

  Future<void> _scanAssets() async {
    try {
      // 初始化AssetsScannerPlus
      AssetsScannerPlus scanner = AssetsScannerPlus();
      // 扫描资源
      List<AssetEntity> assets = await scanner.scanAssets(['assets/images/', 'assets/audios/']);
      // 更新状态
      setState(() {
        _assets = assets;
      });
    } catch (e) {
      print('扫描资源时出错: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Assets Scanner Plus 示例'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: _assets.isEmpty
              ? Center(child: Text('扫描中...'))
              : ListView.builder(
                  itemCount: _assets.length,
                  itemBuilder: (context, index) {
                    AssetEntity asset = _assets[index];
                    return ListTile(
                      title: Text(asset.path),
                      leading: Image.asset(asset.path, width: 50, height: 50), // 仅适用于图片资源
                      trailing: IconButton(
                        icon: Icon(Icons.info),
                        onPressed: () {
                          // 显示资源详细信息
                          showDialog(
                            context: context,
                            builder: (context) {
                              return AlertDialog(
                                title: Text('资源信息'),
                                content: Text('路径: ${asset.path}\n类型: ${asset.type}'),
                              );
                            },
                          );
                        },
                      ),
                    );
                  }),
        ),
      ),
    );
  }
}

代码说明

  1. 依赖添加:在pubspec.yaml中添加assets_scanner_plus依赖。
  2. 资源配置:在pubspec.yamlflutter部分配置你的资源文件路径。
  3. 初始化与扫描:在initState方法中初始化AssetsScannerPlus实例并调用scanAssets方法扫描资源。
  4. UI展示:在UI中使用ListView.builder展示扫描到的资源,并为每个资源项添加一个详细信息按钮。

注意事项

  • AssetsScannerPlus扫描到的资源路径是相对于pubspec.yaml中配置的路径的。
  • 上述示例中,Image.asset仅用于展示图片资源,如果你的资源是音频或其他类型,请根据实际情况处理。
  • 请确保你的Flutter环境已经正确配置,并且所有依赖都已经成功获取。

希望这个示例能帮助你更好地理解和使用assets_scanner_plus插件!

回到顶部