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

Posted

技术标签:

【中文标题】如何防止platformViewRegistry出错[flutter-web]【英文标题】:How to prevent error of platformViewRegistry [flutter-web] 【发布时间】:2021-02-21 04:13:39 【问题描述】:

我正在尝试在我的网页(flutter web)中添加 pdf 视图。这是代码的一部分

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'.

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

【问题讨论】:

作为让分析器满意的附加选项,您可以尝试PR 中定义的解决方案。检查dart_ui.dartdart_ui_fake.dartdart_ui_real.dart。它是有条件导入和垫片的组合。此问题已为人所知,并由 Github 中的 issue 跟踪。 【参考方案1】:

编辑使用analysis_options.yaml

analyzer:
  errors:
    undefined_prefixed_name: ignore

您可以在下面复制粘贴运行完整代码 你可以使用// ignore: undefined_prefixed_name 代码sn-p

// 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'));
  

【讨论】:

感谢您的回答,我已经尝试了您的代码.. 它运行完美...但我的编辑器中仍然有红色下划线,它仍然说这是因为前缀或.. ....,我已经编辑了我的问题并添加了一张红色下划线的照片.. 尽管代码运行完美,是否可以防止红色下划线? @uyhaW 尝试重新启动分析器或 ide。 @uyhaW,请使用 analysis_options.yaml,查看我的更新答案 @AbhilashChandran,我已经阅读了你给我的链接,@chunhunghan 我也跟着你的回答,最后我通过添加 FakeUi.dart、RealUi.dart 和最后一个找到了解决方案正在与pubspec.yaml 在同一个文件夹中创建analysis_options.yaml...效果非常好...红色下划线消失了...非常感谢您

以上是关于如何防止platformViewRegistry出错[flutter-web]的主要内容,如果未能解决你的问题,请参考以下文章

Flutter Web iFrame 奇怪的行为

我如何防止在 angularJs 中显示引导弹出窗口

如何防止某些 HTTP 方法从我的 MongoRepository 中导出?

如何防止弹出窗口放大移动?

将 DirectX 精灵移出屏幕时如何防止其被擦除

如何防止出队的集合视图单元格相互重叠?