帮别人处理一个关于flutter web pdf预览的小问题

作者 : 开心源码 本文共2356个字,预计阅读时间需要6分钟 发布时间: 2022-05-14 共237人阅读
问题形容

使用file_picker进行本地pdf文件预览 在ios跟andriod端正常 但是在web端选取的pdf的path值为空

处理步骤

file_picker 这个库在pub上表明是支持web端的 但是实际测试的确无法拿到pdf的path路径,于是我找啊找 还是没有找到三端都支持的库 只能换思路 web端单独解决
按照之前web端文件上传的思路

获取到选择的pdf的base64
class DocumentPicker {  static Future<List<dynamic>> open(    {List<String> types, bool multiple = false}) async {      final completer = Completer<List<String>>();      html.InputElement uploadInput = html.FileUploadInputElement();      if (types != null && types.length > 0) {        String theTypes = types.join(',');        uploadInput.accept = theTypes;  }    uploadInput.multiple = multiple;    uploadInput.click();    uploadInput.addEventListener('change', (e) async {    final files = uploadInput.files;    Iterable<Future<String>> resultsFutures = files.map((file) {    final reader = html.FileReader();    reader.readAsDataUrl(file);    reader.onError.listen((error) => completer.completeError(error));    return reader.onLoad.first.then((_) => reader.result as String);  });    final results = await Future.wait(resultsFutures);    completer.complete(results);  });  html.document.body.append(uploadInput);  return completer.future;  }}
将base64 转成 Unit8List
 Future<Uint8List> _createFileFromString(base64Str) async {    final encodedStr = base64Str;    Uint8List bytes = base64.decode(encodedStr);    return bytes;}void _openFileExplorerWeb(context) async {  try {      DocumentPicker.open(types: ['data:content/type']).then((list) async {      String base64Str = list[0].toString().split(',')[1];      Uint8List bytes = await _createFileFromString(base64Str);      final blob = html.Blob([bytes], 'application/pdf');      final url = html.Url.createObjectUrlFromBlob(blob);      html.window.open(url, "_blank");      html.Url.revokeObjectUrl(url);    }    } on PlatformException catch (e) {      print("Unsupported operation" + e.toString());    }  }}
还要在web端判断一下 当前能否是web端 由于web不支持platform 所以需要用到
import 'dart:io';import 'package:flutter/foundation.dart';class PlatformUtils {  static bool _isWeb() {    // 通过kIsWeb变量判断能否为web环境!    return kIsWeb == true;  }  static bool _isAndroid() {    return _isWeb() ? false : Platform.isAndroid;  }static bool _isIOS() {  return _isWeb() ? false : Platform.isIOS;}  static bool _isMacOS() {    return _isWeb() ? false : Platform.isMacOS;  }  static bool _isWindows() {    return _isWeb() ? false : Platform.isWindows;  }  static bool _isFuchsia() {    return _isWeb() ? false : Platform.isFuchsia;  }   static bool _isLinux() {      return _isWeb() ? false : Platform.isLinux;    }    static bool get isWeb => _isWeb();    static bool get isAndroid => _isAndroid();    static bool get isIOS => _isIOS();    static bool get isMacOS => _isMacOS();    static bool get isWindows => _isWindows();    static bool get isFuchsia => _isFuchsia();    static bool get isLinux => _isLinux();}
说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 帮别人处理一个关于flutter web pdf预览的小问题

发表回复