#flutter #pdf #flutter-web
#флаттер #PDF #flutter-web
Вопрос:
Я пытаюсь добавить просмотр pdf на свою веб-страницу (flutter web).. вот часть кода
ui.platformViewRegistry.registerViewFactory(
'hello-world-html',
(int viewId) => html.IFrameElement()
..width = '700'
..height = '4000'
..src = 'http:xxx.pdf'
..style.border = 'none');
код выполняется так, как я хочу, но я получаю такую ошибку
The name 'platformViewRegistry' is being referenced through the prefix 'ui', but it isn't defined in any of the libraries imported using that prefix.
Try correcting the prefix or importing the library that defines 'platformViewRegistry'.
есть ли способ предотвратить возникновение этой ошибки?
Комментарии:
1. В качестве дополнительной опции для обеспечения работоспособности анализатора вы можете попробовать решение, определенное в этом PR . Проверьте
dart_ui.dart
,dart_ui_fake.dart
иdart_ui_real.dart
. Это комбинация условного импорта и прокладок. Эта проблема уже известна и отслеживается по этой проблеме в Github.
Ответ №1:
Редактировать использовать analysis_options.yaml
analyzer:
errors:
undefined_prefixed_name: ignore
Вы можете скопировать вставить запустить полный код ниже
Вы можете использовать // ignore: undefined_prefixed_name
фрагмент кода
// ignore: undefined_prefixed_name
ui.platformViewRegistry.registerViewFactory(
'hello-world-html',
(int viewId) => html.IFrameElement()
..width = '700'
..height = '4000'
..src = 'http:xxx.pdf'
..style.border = 'none');
рабочая демонстрация
полный код имитации
import 'package:flutter/material.dart';
// import 'dart:io' if (dart.library.html) 'dart:ui' as ui;
import 'dart:ui' as ui;
import 'dart:html' as html;
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(child: Iframe()),
floatingActionButton: FloatingActionButton(
onPressed: () {},
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}
class Iframe extends StatelessWidget {
Iframe() {
// ignore: undefined_prefixed_name
ui.platformViewRegistry.registerViewFactory('iframe', (int viewId) {
var iframe = html.IFrameElement();
iframe.src = 'http://www.africau.edu/images/default/sample.pdf';
return iframe;
});
}
@override
Widget build(BuildContext context) {
return Container(
width: 400, height: 300, child: HtmlElementView(viewType: 'iframe'));
}
}
Комментарии:
1. спасибо за ответ, я попробовал ваш код .. и он работает отлично… но я все еще получаю красное подчеркивание в своем редакторе, и оно по-прежнему говорит, что это произошло из-за префикса или ……, я отредактировал свой вопрос и добавил фотографию красного подчеркивания.. возможно ли предотвратить красное подчеркивание, хотя код работает отлично?
2. @uyhaW Попробуйте перезапустить анализатор или среду ide.
3. @uyhaW, пожалуйста, используйте analysis_options.yaml, смотрите мой обновленный ответ
4. @AbhilashChandran, я прочитал ссылку, которую вы мне дали, и @chunhunghan Я тоже следил за вашим ответом, и, наконец, я нашел решение, добавив FakeUi.dart, RealUi.dart, и последнее создается
analysis_options.yaml
в той же папке с.pubspec.yaml
.. и это работает действительно хорошо … и красное подчеркивание исчезло … большое спасибо5. Использование undefined_prefixed_name: ignore может быть излишним и может быть рискованным. Это приведет к подавлению всех ошибок в виде a.b, где a является префиксом и
b
не распознается. Если это более крупный проект или проект, в котором сильно используются префиксы, я настоятельно рекомендую мой предложенный ответ, в котором вместо этого используется простая прокладка из двух файлов.
Ответ №2:
предложенное чунхунханом исправление игнорирования undefined_prefix_name является излишним и рискованным. Если вы сделаете это, все ошибки типа prefix.wrongValue
будут подавлены в вашей IDE. Если вы работаете над небольшим / личным проектом, это нормально, но если вы работаете над более масштабным проектом, я бы не советовал этого делать.
Лучшим решением является создание файла прокладки для не-веб-контекстов, например:
platform_view_registry.dart
export 'package:my_package/src/fake_platform_view_registry.dart'
if (dart.library.html) 'dart:ui' show platformViewRegistry;
fake_platform_view_registry.dart
// add either a dynamically typed variable
dynamic platformViewRegistry;
// or a more thorough shim like this one
class FakePlatformViewRegistry {
void registerViewFactory(
String viewTypeId, dynamic Function(int) viewFactory) {
throw UnsupportedError("platform view registry in non-web context");
}
}
final platformViewRegistry = FakePlatformViewRegistry();
Затем просто импортируйте package:my_package/src/platform_view_registry.dart
вместо dart:ui
(и, вероятно, удалите ui
префикс тоже).
import "package:my_package/src/platform_view_registry.dart";
...
platformViewRegistry.registerViewFactory(
'hello-world-html',
(int viewId) => html.IFrameElement()
..width = '700'
..height = '4000'
..src = 'http:xxx.pdf'
..style.border = 'none');