如何防止platformViewRegistry [flutter-web] 出错

uyh*_*haW 4 pdf flutter 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');
Run Code Online (Sandbox Code Playgroud)

代码像我想要的那样运行,但我收到这样的错误

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'.
Run Code Online (Sandbox Code Playgroud)

有没有办法防止这种错误发生?

在此处输入图片说明

chu*_*han 11

编辑使用analysis_options.yaml

analyzer:
  errors:
    undefined_prefixed_name: ignore
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

您可以在下面复制粘贴运行完整代码
您可以使用// 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');
Run Code Online (Sandbox Code Playgroud)

工作演示

在此处输入图片说明

完整的模拟代码

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'));
  }
}
Run Code Online (Sandbox Code Playgroud)


Mik*_*rst 6

chunhunghan 提出的忽略 undefined_prefix_name 的修复方案过于杀伤力且有风险。如果您这样做,所有该类型的错误都prefix.wrongValue将在您的 IDE 中被抑制。如果您正在进行小型/个人项目,这很好,但如果您正在进行较大规模的项目,我建议您不要这样做。

更好的解决方案是为非 Web 上下文创建一个填充文件,如下所示:

platform_view_registry.dart

export 'package:my_package/src/fake_platform_view_registry.dart'
  if (dart.library.html) 'dart:ui' show platformViewRegistry;
Run Code Online (Sandbox Code Playgroud)

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();
Run Code Online (Sandbox Code Playgroud)

然后只需导入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');
Run Code Online (Sandbox Code Playgroud)