Flutter for OpenHarmony 实战:file_selector — 原生文件选择指南

【Flutter文件操作】File_selector全攻略:本地文件读写看这一篇就够了 在Flutter跨平台开发中,文件操作是常见的需求场景。官方推荐的插件完美解决了各平台(Android/iOS/Windows/macOS/Linux/Web)文件操作的兼容性问题。本文将带你全面掌握这个"万能文件选择器"的使用技巧,包含完整代码示例和平台适配方案。"告别平台差异,一个API搞定全平台文件操作! 阅读详情

Flutter for OpenHarmony 实战:file_selector — 原生文件选择指南

前言

在移动应用开发中,让用户选择文件(如图片、文档、视频)是一个非常高频的需求。虽然 image_picker 可以处理图片和视频,但当我们需要选择任意类型的文件(如 PDF、JSON、ZIP)时,就需要更通用的解决方案。

file_selector 是 Flutter 官方提供的插件,旨在提供跨平台(iOS, Android, Web, Desktop, OpenHarmony)的统一文件选择能力。在 OpenHarmony 上,它对接了系统的 FilePicker 接口,能够拉起原生的文件选择器,用户体验非常流畅。

本文将介绍如何在 OpenHarmony 项目中集成 file_selector,实现单文件选择、多文件选择以及保存文件(另存为)的功能。

一、核心功能

file_selector 的 API 设计非常简洁,主要包含以下几个核心方法:

  • openFile: 选择单个文件。
  • openFiles: 选择多个文件。
  • path_provider: 保存文件
  • getSaveLocation: 获取文件保存路径(即“另存为”对话框)。

二、安装与配置

2.1 添加依赖

在 pubspec.yaml 中添加:

dependencies:
  flutter:
    sdk: flutter
  # 请务必检查 pub.dev 或 OpenHarmony SIG 仓库获取适配 OHOS 的版本
  file_selector: ^1.0.0
  file_selector_ohos: any
  path_provider_ohos: any
  path_provider: ^2.1.5

dependency_overrides:
 # File Selector 全套覆盖
  file_selector:
    git:
      url: "https://atomgit.com/openharmony-tpc/flutter_packages.git"
      path: "packages/file_selector/file_selector"
  file_selector_platform_interface:
    git:
      url: "https://atomgit.com/openharmony-tpc/flutter_packages.git"
      path: "packages/file_selector/file_selector_platform_interface"
  file_selector_ohos:
    git:
      url: "https://atomgit.com/openharmony-tpc/flutter_packages.git"
      path: "packages/file_selector/file_selector_ohos"
        # Path Provider Adapter
  path_provider_ohos:
    git:
      url: "https://atomgit.com/openharmony-tpc/flutter_packages.git"
      path: "packages/path_provider/path_provider_ohos"

在这里插入图片描述

2.2 OpenHarmony 权限配置

使用系统的 Picker 接口选择文件通常是一个“用户授权”的过程(用户主动选择文件即视为授权),因此通常不需要像 Android 那样申请 READ_EXTERNAL_STORAGE 权限。OpenHarmony 的沙箱机制会自动授权应用读取用户选中的那个文件。

但是,如果你需要访问特定公共目录,可以按需检查 module.json5 中的权限配置,一般来说,基础的文件选择无需额外配置。

三、代码实现

3.1 选择单个文件

我们可以指定 XTypeGroup 来过滤文件类型,例如只允许选择文本文件或图片。

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

class FileSelectorPage extends StatelessWidget {
  const FileSelectorPage({super.key});

  Future<void> _pickSingleFile(BuildContext context) async {
    // 定义文件类型过滤器
    const XTypeGroup typeGroup = XTypeGroup(
      label: 'images',
      extensions: <String>['jpg', 'png'],
    );
    
    // 打开选择器
    final XFile? file = await openFile(
      acceptedTypeGroups: <XTypeGroup>[typeGroup],
    );

    if (file != null) {
      // 获取文件名和路径
      print('文件名: ${file.name}');
      print('路径: ${file.path}');
      
      // 读取文件内容
      final int size = await file.length();
      print('文件大小: $size 字节');
      
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('已选择: ${file.name}')),
      );
    } else {
      // 用户取消了选择
      print('用户取消操作');
    }
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('文件选择演示')),
      body: Center(
        child: ElevatedButton(
          onPressed: () => _pickSingleFile(context),
          child: const Text('选择一张图片'),
        ),
      ),
    );
  }
}

在这里插入图片描述

3.2 选择多个文件

使用 openFiles 方法即可,返回的是 List<XFile>。

Future<void> _pickMultipleFiles() async {
  final List<XFile> files = await openFiles(
    acceptedTypeGroups: <XTypeGroup>[
      const XTypeGroup(label: 'All Files'), // 允许所有类型
    ],
  );

  print('选择了 ${files.length} 个文件');
  for (var file in files) {
    print('路径: ${file.path}');
  }
}

在这里插入图片描述

3.3 保存文件(另存为)

在 OpenHarmony 上,这会拉起系统的“保存文件”面板,让用户选择保存的位置和文件名。

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:file_selector/file_selector.dart';
import 'package:path_provider/path_provider.dart';

class SaveFilePage extends StatelessWidget {
  const SaveFilePage({super.key});

  Future<void> _saveFile(BuildContext context) async {
    final String fileName =
        'my_export_data_${DateTime.now().millisecondsSinceEpoch}.txt';

    try {
      debugPrint('准备保存文件...');

      // 1. 获取应用私有文档目录 (Sandboxed)
      // 由于 file_selector_ohos 暂未实现 getSaveLocation,
      // 我们推荐使用标准路径保存数据
      final Directory directory = await getApplicationDocumentsDirectory();
      final String path = '${directory.path}/$fileName';

      debugPrint('目标路径: $path');

      // 2. 写入文件
      final File file = File(path);
      await file.writeAsString(
          'Hello OpenHarmony from Flutter! \nSaved at ${DateTime.now()}');

      debugPrint('文件写入成功');

      if (context.mounted) {
        // 3. 提示用户
        showDialog(
          context: context,
          builder: (ctx) => AlertDialog(
            title: const Text('保存成功'),
            content: SingleChildScrollView(
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                mainAxisSize: MainAxisSize.min,
                children: [
                  const Text('文件已保存至应用沙箱目录:'),
                  const SizedBox(height: 8),
                  Container(
                    padding: const EdgeInsets.all(8),
                    color: Colors.grey[200],
                    child: Text(path, style: const TextStyle(fontSize: 12)),
                  ),
                  const SizedBox(height: 16),
                  const Text(
                      '注:由于 file_selector 暂未适配 OpenHarmony "另存为" 接口,此处演示使用 path_provider 保存到应用私有目录。',
                      style: TextStyle(color: Colors.grey, fontSize: 12)),
                ],
              ),
            ),
            actions: [
              TextButton(
                onPressed: () => Navigator.pop(ctx),
                child: const Text('好的'),
              ),
            ],
          ),
        );
      }
    } catch (e) {
      debugPrint('保存出错: $e');
      if (context.mounted) {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('保存失败: $e')),
        );
      }
    }
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('3.3 保存文件 (替代方案)')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            const Padding(
              padding: EdgeInsets.all(16.0),
              child: Text(
                '注:OpenHarmony 暂不支持 file_selector 的 "另存为" (getSaveLocation)。\n'
                '本页演示使用 path_provider 保存文件到应用沙箱。',
                textAlign: TextAlign.center,
                style: TextStyle(color: Colors.grey),
              ),
            ),
            ElevatedButton(
              onPressed: () => _saveFile(context),
              child: const Text('保存 text 文件到沙箱'),
            ),
          ],
        ),
      ),
    );
  }
}

在这里插入图片描述

四、OpenHarmony 平台适配细节

4.1 路径与沙箱

OpenHarmony 采用严格的沙箱机制。当用户通过 Picker 选择文件后,系统通常会授予应用对该文件的临时读写权限。file_selector 返回的 path 通常是一个可以直接供 Dart File 对象读取的路径。

4.2 MIME Type 过滤

XTypeGroup 支持 extensions(扩展名)、mimeTypes(MIME类型)和 macUTIs(iOS专用)。在 OpenHarmony 上,建议优先使用 extensions,兼容性最好。

// 推荐做法:使用扩展名
const XTypeGroup(extensions: ['pdf', 'doc']);

// 可能存在兼容性差异:使用 MIME
// const XTypeGroup(mimeTypes: ['application/pdf']); 

4.3 UI 差异

file_selector 在 OpenHarmony 上调用的是系统级的 UI(FilePicker)。这意味着 UI 样式(如列表视图、网格视图、排序方式)是由系统决定的,Flutter 无法修改其外观,只能控制可选的文件类型。

五、完整示例代码

下面是一个综合示例,包含单选、多选和保存功能。

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:file_selector/file_selector.dart';
import 'package:path_provider/path_provider.dart';

class FileSelectorPage extends StatefulWidget {
  const FileSelectorPage({super.key});

  
  State<FileSelectorPage> createState() => _FileSelectorPageState();
}

class _FileSelectorPageState extends State<FileSelectorPage> {
  String _statusText = '请选择操作';
  List<XFile> _selectedFiles = [];

  // 选择图片
  Future<void> _pickImage() async {
    const XTypeGroup typeGroup = XTypeGroup(
      label: 'images',
      extensions: <String>['jpg', 'png', 'gif'],
    );
    // 捕获异常,防止在不支持的平台上崩溃
    try {
      final XFile? file = await openFile(acceptedTypeGroups: [typeGroup]);
      if (file != null) {
        setState(() {
          _statusText = '已选择: ${file.name}';
          _selectedFiles = [file];
        });
      } else {
        // 用户取消
      }
    } catch (e) {
      setState(() {
        _statusText = '错误: $e';
      });
    }
  }

  // 选择多个文档
  Future<void> _pickDocs() async {
    const XTypeGroup typeGroup = XTypeGroup(
      label: 'documents',
      extensions: <String>['pdf', 'txt', 'json'],
    );
    try {
      final List<XFile> files =
          await openFiles(acceptedTypeGroups: [typeGroup]);
      if (files.isNotEmpty) {
        setState(() {
          _statusText = '已选择 ${files.length} 个文件';
          _selectedFiles = files;
        });
      }
    } catch (e) {
      setState(() {
        _statusText = '错误: $e';
      });
    }
  }

  // 另存为 (模拟导出功能)
  // 注: 由于 file_selector_ohos 暂未实现 getSaveLocation,这里使用 path_provider 替代
  Future<void> _saveText() async {
    try {
      final Directory directory = await getApplicationDocumentsDirectory();
      final String fileName =
          'example_${DateTime.now().millisecondsSinceEpoch}.txt';
      final String path = '${directory.path}/$fileName';

      // 写入数据
      final file = File(path);
      await file.writeAsString(
          '这是通过 Flutter file_selector 页面演示保存的文件内容。\nTime: ${DateTime.now()}');

      if (!mounted) return;
      setState(() {
        _statusText = '文件已保存至沙箱: $path';
      });

      // 弹出详细信息的 Dialog
      showDialog(
        context: context,
        builder: (ctx) => AlertDialog(
          title: const Text('保存成功 (path_provider)'),
          content: SingleChildScrollView(
            child: Text('文件已写入应用私有目录:\n\n$path\n\n(OpenHarmony 暂不支持原生“另存为”面板)'),
          ),
          actions: [
            TextButton(
                onPressed: () => Navigator.pop(ctx), child: const Text('OK'))
          ],
        ),
      );
    } catch (e) {
      setState(() {
        _statusText = '保存失败: $e';
      });
    }
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('File Selector OHOS')),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            Container(
              padding: const EdgeInsets.all(12),
              width: double.infinity,
              decoration: BoxDecoration(
                color: Colors.grey[200],
                borderRadius: BorderRadius.circular(8),
              ),
              child: Text(_statusText, style: const TextStyle(fontSize: 16)),
            ),
            const SizedBox(height: 20),

            // 选中文件列表区域
            Expanded(
              child: _selectedFiles.isEmpty
                  ? Center(
                      child: Column(
                        mainAxisSize: MainAxisSize.min,
                        children: [
                          Icon(Icons.folder_open,
                              size: 64, color: Colors.indigo[100]),
                          const SizedBox(height: 16),
                          const Text('暂无选中文件',
                              style: TextStyle(color: Colors.grey)),
                        ],
                      ),
                    )
                  : ListView.builder(
                      itemCount: _selectedFiles.length,
                      itemBuilder: (ctx, index) {
                        final file = _selectedFiles[index];
                        return Card(
                          elevation: 2,
                          margin: const EdgeInsets.only(bottom: 8),
                          child: ListTile(
                            leading: Icon(
                              _getFileIcon(file.name),
                              color: Colors.indigo,
                            ),
                            title: Text(file.name),
                            subtitle: Text(file.path,
                                maxLines: 1, overflow: TextOverflow.ellipsis),
                            trailing: Text(
                              _formatSize(
                                  index), // 仅为演示,实际需异步获取 await file.length()
                              style: const TextStyle(
                                  fontSize: 12, color: Colors.grey),
                            ),
                          ),
                        );
                      },
                    ),
            ),

            const Divider(),

            // 操作按钮区域
            Wrap(
              spacing: 16,
              runSpacing: 16,
              alignment: WrapAlignment.center,
              children: [
                _ActionButton(
                  icon: Icons.image,
                  label: '选图片',
                  color: Colors.purple,
                  onPressed: _pickImage,
                ),
                _ActionButton(
                  icon: Icons.library_books,
                  label: '选文档(多选)',
                  color: Colors.orange,
                  onPressed: _pickDocs,
                ),
                _ActionButton(
                  icon: Icons.save,
                  label: '另存为',
                  color: Colors.blue,
                  onPressed: _saveText,
                ),
              ],
            ),
            const SizedBox(height: 20),
          ],
        ),
      ),
    );
  }

  IconData _getFileIcon(String name) {
    final lowerName = name.toLowerCase();
    if (lowerName.endsWith('.jpg') || lowerName.endsWith('.png'))
      return Icons.image;
    if (lowerName.endsWith('.pdf')) return Icons.picture_as_pdf;
    if (lowerName.endsWith('.txt')) return Icons.description;
    if (lowerName.endsWith('.json')) return Icons.code;
    return Icons.insert_drive_file;
  }

  String _formatSize(int index) {
    // 真实场景下 XFile.length() 是 Future,这里为了 UI 简洁未调用
    return 'Tap to read';
  }
}

class _ActionButton extends StatelessWidget {
  final IconData icon;
  final String label;
  final Color color;
  final VoidCallback onPressed;

  const _ActionButton({
    required this.icon,
    required this.label,
    required this.color,
    required this.onPressed,
  });

  
  Widget build(BuildContext context) {
    return ElevatedButton.icon(
      style: ElevatedButton.styleFrom(
        backgroundColor: color,
        foregroundColor: Colors.white,
        padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 12),
      ),
      onPressed: onPressed,
      icon: Icon(icon),
      label: Text(label),
    );
  }
}

在这里插入图片描述

六、总结

file_selector 为 OpenHarmony 应用提供了标准化的文件交互能力。相比于直接调用原生 Channel,使用此插件能保持代码的跨平台一致性。

在处理大文件读取时,建议配合 Dart 的 Stream 或 Isolate 来避免阻塞 UI 线程。


🌐 欢迎加入开源鸿蒙跨平台社区:开源鸿蒙跨平台开发者社区

flutter_file_picker:Flutter的文件选取器插件,与iOS,Android和台式机兼容(go-flutter) 文件选取器 一个允许您使用本机文件浏览器选择单个或多个文件的程序包,并具有扩展名过滤支持。 当前支持的功能 使用操作系统默认的本机选择器 使用自定义格式过滤选择文件-您可以提供文件扩展名列表(pdf,svg,zip等) 从云文件(GDrive,Dropbox,iCloud)中选择文件 单个或多个文件选择 不同的默认类型过滤(媒体,图像,视频,音频或任何其他类型) 选择目录 颤动网 台式机(通过Flutter Go的MacOS,Linux和Windows) 如果需要,将文件数据立即加载到内存( Uint8List )中; 如果您希望在此软件包中看到任何功能,请随时提出建议。 :party_popper: 文献资料 有关如何安装,设置和使用它的每个详细,请参见 。 文件选择器Wiki 台式机(颤振) 原料药 筛选器 参数 方法 常问问题 故障排除 用法 快速简单的用法示例: 单文件 FilePicker 立即下载

相关推荐

你必须掌握在Flutter中添加资源文件的方法

主要介绍了你必须掌握在Flutter中添加资源文件的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

Flutter 文件选择选择器 文件选择、选择word、pdf、excel等文件 fget_file

flutter_file_selector 文件选择插件,支持多选 ,演示示例在example目录 我代码我传到码云上了,点我跳转 下面是效果图: 第三张是ios端 本插件使用到的依赖 插件依赖 pub仓库地址 ermission_handler 权限申请 pub file_picker 调用选择器(IOS端使用的是这个) pub 使用 flutter_file_selector: # 在pubspec.yaml 中引入依赖 flutterfileselecto

jq的博客 7418

flutter file-selector

Flutter的file_selector插件可以帮助开发者在移动应用中方便地选择文件。 要使用file_selector插件,首先需要将插件的依赖项添加到pubspec.yaml文件中,并运行flutter pub get命令获取插件的最新版本。 在插件使用方面,file_selector插件可以方便地实现文件选择功能,支持多选和所有类型的文件,并且在选择文件后可以获取到文件的路径和其他信息。 在使用file_selector插件时,需要注意以下几点: 在Android系统中,需要添加相关的权限和配置,以确保文件选择功能正常运行; 在iOS系统中,需要在Info.plist文件中添加相关的权限和配置; 在实现多选时,需要使用到Flutter的Future和async/await等技术,确保异步操作的正确处理; 在获取文件信息时,需要使用到Flutter的Intent和ActivityResult等类,以便正确处理Android系统中的Intent和返回结果。 总之,file_selector插件是Flutter中非常实用的一个插件,可以帮助开发者方便地实现文件选择功能,提高移

第一百零五回 全局共享数据之Selector

本章回中介绍了如何使用Selector进行状态管理和数据共享,介绍了Selector中各个属性的功能和用法,并且通过示例代码进行了演示。

talk_8的专栏 352

ESP32驱动MLX90640红外热成像传感器:从报错到成功运行的完整避坑指南

本文是一份详细的ESP32驱动MLX90640红外热成像传感器的实战指南。针对开发中常见的I2C通信失败、数据全零及‘坏点过多’等报错,文章提供了从环境搭建、驱动库选择与改造到实战代码解析的完整解决方案,并分享了数据滤波、热图生成及多任务优化等高级技巧,帮助开发者高效避坑,实现稳定运行。

weixin_29191669的博客 85

MATLAB 论文复现——面向电量-调频-容量市场的数据中心园区算力及电力资源规划

如何在保证数据中心服务质量的前提下,考虑数据中心负荷转移特性,并对其进行合理规划,对降低数据中心规划总成本及提升新型电力系统灵活性均有显著意义。然后,根据不同电力市场的结算规则,研究了数据中心园区参与电量-调频-容量市场的方式和经济收益。在此基础上,以综合成本最小化为目标,优化数据中心园区发电机、储能的建设容量以及服务器的建设数量。最后,以阿里巴巴公开运行数据为例,证明考虑多元电力市场能够大大降低数据中心规划成本,激励数据中心园区投资建设更多灵活性资源,为电网提供有效的调频服务和容量支撑。

sjr1478的博客 661

flutter常用插件

barcode_scan 0.0.8#二维码识别qr_mobile_vision: ^0.1.0 #二维码识别 这个不好用。pull_to_refresh: ‘^1.1.5’#下拉刷新上拉加载更多 //flutter_easyrefresh。shared_preferences: ‘^0.4.2’#shared_preferences存储。cached_network_image: ‘0.4.1’#加载网络图片并本地缓存。flutter_staggered_grid_view:#瀑布流展示控件。

qq_36859035的博客 362

3D视觉-结构光测量-线结构光测量

线结构光测量中,由激光器射出的激光光束透过柱面透镜扩束,再经过准直,产生一束片状光。这片光束像刀刃一样横切在待测物体表面,因此线结构光法又被成为光切法。线结构光测量常采用二维面阵CCD作为接受器件,因此只要通过增加垂直于面阵探测器的第三维度方向,就可以实现对三维物体的测量。

qq_20660115的博客 3108

基础入门 Flutter for OpenHarmony:file_selector 文件选择详解

在 Flutter 应用开发中,文件选择是一个非常常见的需求。比如用户需要上传头像、导入文档、批量处理图片等操作,都需要与设备的文件系统进行交互。不同操作系统(Android、iOS、Windows、macOS、OpenHarmony)的文件系统各不相同,API 也完全不同。如果为每个平台单独编写文件选择代码,工作量巨大且难以维护。就是为了解决这个问题而诞生的插件。它为开发者提供了一个统一的 API,屏蔽了不同平台的文件系统差异,让开发者可以用相同的代码在所有平台上实现文件选择功能。

qq_61024956的博客 986

EDF Browser使用说明和技巧

edf browser使用说明和一些小技巧

Erhu_666的博客 8251

HUMAnN 3.0 (alpha)安装及使用

文章目录简介安装数据库下载运行参考 简介 安装 conda install humann humann_test (~1 minute) 数据库下载 humann_databases --download chocophlan full /path/to/databases --update-config yes humann_databases --download uniref uniref90_diamond /path/to/databases --update-config yes humann_

dys的博客 9489

Flutter for OpenHarmony:引入第三方库file_selector 文件选择详解

文件选择是移动应用中非常常见的功能,无论是上传图片、导入配置文件、选择文档还是批量处理媒体文件,都需要使用到文件选择器。在 Flutter for OpenHarmony 应用开发中,是一个功能强大的文件选择插件,提供了完整的文件选择和管理功能,支持多种文件类型过滤和自定义配置。label: 'images', // 分组标签extensions: <String>['jpg', 'png'], // 文件扩展名本文详细介绍了 Flutter for OpenHarmony 中基础概念。

m0_65527018的博客 964

使用字体解密技术爬取懂车帝二手车数据

本文介绍了一种针对懂车帝二手车平台的字体加密数据采集方案。通过抓包分析,识别出关键API接口并解析了字体加密机制,成功实现了价格等敏感数据的解密。方案采用requests库发送POST请求获取JSON数据,利用fontTools解析字体映射关系,建立加密字符到真实数字的转换算法。程序支持多页采集,提取车辆名称、价格、年份等12个维度的信息,并自动保存为Excel格式。技术亮点包括动态字体解析、健壮的数据处理和分页优化,为二手车市场分析提供了可靠的数据支持。文中特别强调数据采集的合法合规性,建议仅用于学术研究

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 1304

Flutter for OpenHarmony三方库适配实战:file_selector文件选择详解

文件选择是移动应用和桌面应用中非常常见的功能,无论是上传文档、导入配置文件、选择媒体资源还是批量处理文件,都需要使用到文件选择器。在 Flutter for OpenHarmony 应用开发中, 是一个功能强大的文件选择插件,提供了完整的文件选择和管理功能,支持多种文件类型过滤和自定义配置。file_selector 库基于 Flutter 平台接口实现,提供了以下核心特性:单文件选择:支持选择单个文件,返回 对象,包含文件路径、名称、大小等信息。适用于头像上传、文档导入等场景。多文件选择:支持一次选择多

2501_92193083的博客 436

【unity实战】Unity2D TileMap的探究(最简单,最全面的TileMap使用介绍)

之前有人在微信上找我,问了TileMap相关的知识【unity实战】随机地下城生成2——绘制地图Tilemap的使用及一些技巧的使用(含源码)不过写的不是特别不是特别细致,只是简单的用了一下,所有这次特地打算单独写一篇文章,来介绍一下,下次还有人问我,我直接就把这篇文章丢给他,完美!Unity的Tilemap 一般称之为瓦片地图或者平铺地图,是 Unity2017 中新增的功能,主要用于快速编辑 2D 游戏中的场景,通过复用资源的形式提升地图多样性。Tilemap是一个用于创建2D地图的工具。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1万+

使用Python实现卷积神经网络(CNN)

卷积神经网络是一种专门用于处理具有网格状拓扑结构数据(如图像、声音)的深度学习模型。CNN的核心组件是卷积层和池化层,它们能够有效地从图像中提取特征并实现空间不变性,使得模型能够对图像中的物体进行识别和分类。我们定义一个简单的卷积神经网络模型,包括卷积层、池化层和全连接层。return x# 创建模型实例我们选择交叉熵损失函数作为分类任务的损失函数,并使用随机梯度下降(SGD)作为优化器。

Echo_Wish 4484

Flutter_OpenHarmony_三方库_file_selector文件选择适配详解

file_selector 是 Flutter 官方维护的文件选择插件,提供了跨平台的文件选择对话框功能。无论是导入文档、上传图片、选择配置文件,还是批量处理文件,file_selector 都能提供原生体验的文件选择界面。file_selector 是 Flutter 生态中最常用的文件选择插件,在 OpenHarmony 平台的适配已经非常成熟。file_selector 的核心 API 和使用方法XTypeGroup 文件类型过滤的配置方式完整的文件选择应用实现。

2601_94959365的博客 512

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Flutter跨平台三方库file_selector在鸿蒙中的使用指南

本文档详细介绍了在HarmonyOS平台上使用Flutter框架集成file_selector插件的完整流程。主要内容包括:项目初始化配置、权限设置、核心功能实现(单个/多个文件选择)以及Material Design 3风格的UI构建。特别指出当前版本插件暂不支持目录选择功能,并提供了临时解决方案。文档通过实际代码示例展示了文件选择功能的实现方法,包括类型过滤、结果处理和错误提示等关键环节,为开发者提供了在HarmonyOS平台上实现文件选择功能的实用指南。

qq_34025996的博客 834

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Flutter file_selector 库在鸿蒙(OHOS)平台的适配实践与深度解析

通过这个具体的适配案例,我们走完了将一个 Flutter 三方库移植到 OpenHarmony 平台的完整流程。理解原理是基础:掌握 Flutter的工作机制是前提,关键在于在 OHOS 端实现对应的(通常封装在一个Ability中)。做好概念映射:成功适配离不开准确地将 Android/iOS 的原生概念(如IntentActivity)映射到鸿蒙的对应物(如IntentAbility),并遵循其 API 规范进行实现。工程步骤可复用:流程上可以归纳为。

nanxuan521的专栏 1092

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Flutter for OpenHarmony 文件转换助手App实战 - 图片转换功能

图片转换功能展示了如何实现一个完整的文件转换功能。通过合理的UI设计和用户交互,我们创建了一个易用的图片转换工具。在实际应用中,我们需要集成实际的图片处理库来完成转换操作。欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net。

2601_94994779的博客 338

我这样用鸿蒙化Flutter三方库file_selector实现单图片和多图片选择

本文是一篇Flutter插件file_selector在HarmonyOS上的适配实战教程,包含以下核心内容: 依赖配置:通过修改pubspec.yaml文件引入适配鸿蒙的file_selector版本 功能实现: 使用XTypeGroup限制文件类型 调用openFile和openFiles实现单图/多图选择 通过readAsBytes()和Image.memory解决鸿蒙沙箱机制下的图片预览问题 。

mocoding的博客 1903

Flutter与OpenHarmony融合开发:Provider状态管理实践

跨平台开发框架Flutter与OpenHarmony操作系统的结合,为开发者提供了覆盖Android、iOS和OpenHarmony三大平台的高效解决方案。状态管理作为应用开发的核心环节,Provider以其轻量级和高效性成为Flutter生态中的热门选择。通过ChangeNotifier机制实现的状态变更通知,配合Consumer组件的精确订阅,能够有效降低界面不必要的重绘。在工程实践中,Provider与OpenHarmony的分布式能力结合,可实现在智能家居、跨设备文件管理等场景下的状态同步。测试数据

weixin_33691700的博客 524

Flutter+OpenHarmony实战:XMB Tracke

本文介绍了基于Flutter和OpenHarmony的跨平台应用开发实践,重点解析了XMB Tracker项目的工程实现。文章从项目背景、技术栈选择、环境准备入手,详细阐述了Flutter应用如何通过GetX状态管理、SQLite本地存储与OpenHarmony适配插件的协同工作,构建完整的跨平台应用链路。 项目采用分层架构设计,包含View-Controller-Repository-DbService-SQLite的数据流,并针对OpenHarmony平台进行了插件适配。文章提供了项目结构设计、路由配置

gao_dou的博客 500

Flutter鸿蒙应用开发:文件上传功能集成实战(含兼容性适配)

本文为Flutter for OpenHarmony跨平台应用开发系列实战文章,完整记录文件上传功能的全流程开发、OpenHarmony平台兼容性适配、核心功能实现及设备验证过程。作为大一新生开发者,我在macOS环境下使用DevEco Studio开发时,重点关注文件选择库与鸿蒙系统的兼容性,最终选用OpenHarmony适配版本的file_selector库,结合dio网络请求库,完成文件选择UI开发、文件上传逻辑实现、上传进度实时显示、国际化适配及设置页面入口集成,全程解决库兼容性、权限配置、进度监听

a2736484的博客 639

鸿蒙flutter第三方库适配 - 批量重命名工具

运行效果图批量重命名工具是一款专注于文件批量管理的实用工具应用,旨在帮助用户高效地重命名大量文件。应用支持多种重命名规则、实时预览对比、一键撤销操作,让文件管理变得轻松便捷。应用以优雅紫色为主色调,象征创意与效率。涵盖规则设置、文件预览、批量执行、历史记录四大核心模块。用户可以设置前缀后缀、查找替换、序号命名、日期命名等多种规则,实时预览重命名效果,一键执行批量操作。序号规则类型图标描述示例1添加前缀➕在文件名前添加指定文本2添加后缀➕在文件名后添加指定文本3查找替换🔍。

2401_83875693的博客 447

Flutter鸿蒙文件选择器深度解析:文本文件处理与跨平台挑战

label: 'text', // 通用标签extensions: <String>['txt', 'json'], // 两种常见文本格式uniformTypeIdentifiers: <String>['public.text'], // Apple通用文本类型设计考量分析txt扩展名:最通用的纯文本格式,几乎所有文本编辑器支持json扩展名:结构化数据格式,在现代应用中极为常见:iOS/macOS的统一类型标识符,涵盖所有文本类型。

u014054437的博客 1062
上一篇: Flutter for OpenHarmony 实战:webview_flutter — 混合开发核心
下一篇: Flutter for OpenHarmony 实战: google_fonts 动态字体加载与分发实战
苏沁宁
博客等级 码龄1年 1万+粉丝 2206原创
评论 15
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值