Flutter原生资源访问插件native_resource的使用

Flutter原生资源访问插件native_resource的使用

native_resource 是一个轻量级插件,用于从iOS或Android应用的原生侧检索存储的资源值。当您需要集中应用程序配置(例如通过Plist或资源字符串)时,这将非常有用,这些配置被其他原生SDK使用。

该插件读取平台上的值会经过原生资源过滤,如地区或方向(仅限Android)。这样可以确保您分发的优化应用包不包含未使用的资源。

完整示例代码

以下是一个完整的示例,展示了如何在Flutter应用中使用native_resource插件来访问原生资源。

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

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

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  [@override](/user/override)
  void initState() {
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Center(
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: [
              // 显示app名称或CFBundleIdentifier
              Text('app_name / CFBundleIdentifier '),
              FutureBuilder<String>(
                future: NativeResource().read(
                  androidResourceName: 'app_name',
                  iosPlistKey: 'CFBundleIdentifier',
                ),
                initialData: '', // 初始数据为空字符串
                builder: (context, snapshot) {
                  // 返回Text小部件以显示结果
                  return Text('${snapshot.data}');
                },
              ),
              SizedBox(height: 8), // 增加间距

              // 显示sample_key或SampleKey(通过Test.plist)
              Text('sample_key / SampleKey (via Test.plist)'),
              FutureBuilder<String>(
                future: NativeResource().read(
                  androidResourceName: 'sample_key',
                  iosPlistKey: 'SampleKey',
                  iosPlistFile: 'Test', // 指定Plist文件名
                ),
                initialData: '',
                builder: (context, snapshot) {
                  // 返回Text小部件以显示结果
                  return Text('${snapshot.data}');
                },
              )
            ],
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


在 Flutter 中,native_resource 并不是一个官方或广泛使用的插件。如果你需要访问原生资源(例如 Android 的 res 目录或 iOS 的 Assets 目录),通常可以通过以下方式实现:

1. 使用 flutter 自带的资源管理

Flutter 提供了内置的资源管理机制,你可以在 pubspec.yaml 文件中声明资源文件,然后通过 AssetBundle 访问这些资源。

示例:

flutter:
  assets:
    - assets/my_image.png

在代码中访问资源:

import 'package:flutter/services.dart' show rootBundle;

Future<void> loadAsset() async {
  final data = await rootBundle.load('assets/my_image.png');
  // 处理资源数据
}

2. 使用 flutter_native_image 插件

如果你需要处理原生平台的图片资源,可以使用 flutter_native_image 插件。

安装:

dependencies:
  flutter_native_image: ^0.0.6+1

使用:

import 'package:flutter_native_image/flutter_native_image.dart';

Future<void> compressImage() async {
  String path = 'path/to/image.jpg';
  File compressedFile = await FlutterNativeImage.compressImage(path, quality: 80);
  // 处理压缩后的文件
}

3. 自定义平台通道

如果你需要访问特定的原生资源,可以通过自定义平台通道来实现。

Android 示例:

MainActivity.kt 中:

import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel

class MainActivity: FlutterActivity() {
    private val CHANNEL = "com.example.app/resource"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
            if (call.method == "getResource") {
                val resourceId = resources.getIdentifier("my_resource", "drawable", packageName)
                result.success(resourceId)
            } else {
                result.notImplemented()
            }
        }
    }
}

在 Flutter 中:

import 'package:flutter/services.dart';

Future<void> getResource() async {
  const platform = MethodChannel('com.example.app/resource');
  try {
    final int resourceId = await platform.invokeMethod('getResource');
    print('Resource ID: $resourceId');
  } on PlatformException catch (e) {
    print("Failed to get resource: '${e.message}'.");
  }
}

4. 使用 path_provider 插件访问文件系统

如果你需要访问设备文件系统中的资源,可以使用 path_provider 插件。

安装:

dependencies:
  path_provider: ^2.0.11

使用:

import 'package:path_provider/path_provider.dart';

Future<void> getAppDirectory() async {
  final directory = await getApplicationDocumentsDirectory();
  print('App directory: ${directory.path}');
}
回到顶部