Флаттер с HTML
Flutter растет вместе со своими библиотеками и сообществом. Раньше мы могли использовать машинное обучение и Flutter вместе для создания мощных приложений. Теперь мы также можем комбинировать Flutter и HTML. Если есть статическая веб-страница HTML, которую мы хотим отобразить в нашем приложении, созданном с помощью Flutter. С помощью этого пакета Flutter flutter_html мы можем отображать всю веб-страницу в приложении Flutter.
HTML и Flutter разные, если мы хотим визуализировать HTML-страницу с помощью CSS во Flutter, это кажется странным. Это означает, как возможно, что HTML-код будет отображаться на экране с помощью Flutter. Звучит сложно, но пока пакет flutter_html во Flutter не был опубликован. В этой статье мы узнаем о работе этой библиотеки Flutter, создав пример приложения.
Реализация:
Шаг 1: Для начала создайте проект Flutter.
Шаг 2: Добавьте зависимость
В файле pubspec.yaml добавьте пакет flutter_html в раздел зависимостей.
Чтобы установить его, запустите pub get в терминале IDE или просто нажмите CTRL+S в Windows, чтобы добавить его.
Шаг 3: Импорт зависимости.
В файле main.dart импортируйте зависимость как —
Dart
import "package:flutter_html/flutter_html.dart" ; |
Шаг 4: Получите HTML-страницу.
Теперь получите HTML-страницу, которую мы хотим отобразить на экране во Flutter. Например, мы берем образец кода HTML:
Мы не можем назначить htmlData виджету Text, мы должны использовать пакет flutter_html для отображения этих htmlData в приложении.
Шаг 5: Используйте виджет HTML() и присвойте значения его свойствам. Мы назначим htmlData его свойству данных, а все теги Html — tagsList .
Dart
Html( data: htmlData, tagsList: Html.tags, style: { "table" : Style( backgroundColor: Color.fromARGB(0x50, 0xee, 0xee, 0xee), ), "tr" : Style( border: Border(bottom: BorderSide(color: Colors.grey)), ), "th" : Style( padding: EdgeInsets.all(6), backgroundColor: Colors.grey, ), "td" : Style( padding: EdgeInsets.all(6), alignment: Alignment.topLeft, ), "h5" : Style(maxLines: 2, textOverflow: TextOverflow.ellipsis), }, ), |
Исходный код:
Dart
import "package:flutter/material.dart" ; import "package:flutter_html/flutter_html.dart" ; void main() => runApp( new MyApp()); class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return new MaterialApp( title: "Flutter Demo" , theme: new ThemeData( primarySwatch: Colors.green, ), home: MyHomePage(), ); } } class MyHomePage extends StatefulWidget { @override _MyHomePageState createState() => new _MyHomePageState(); } const htmlData = r "" " <p id= "top" ><a href= "#" >This is the Link</a></p> <h1>Header 1</h1> <h2>Header 2</h2> <h3>Header 3</h3> <h4>Header 4</h4> <h5>Header 5</h5> <h6>Header 6</h6> <h3>This is HTML page that we want to integrate with Flutter.</h3> "" "; class _MyHomePageState extends State<MyHomePage> { @override Widget build(BuildContext context) { return new Scaffold( appBar: AppBar( title: Text( "GeeksForGeeks" ), centerTitle: true , ), body: SingleChildScrollView( child: Html( data: htmlData, tagsList: Html.tags, style: { "table" : Style( backgroundColor: Color.fromARGB(0x50, 0xee, 0xee, 0xee), ), "tr" : Style( border: Border(bottom: BorderSide(color: Colors.grey)), ), "th" : Style( padding: EdgeInsets.all(6), backgroundColor: Colors.grey, ), "td" : Style( padding: EdgeInsets.all(6), alignment: Alignment.topLeft, ), "h5" : Style(maxLines: 2, textOverflow: TextOverflow.ellipsis), }, ), ), ); } } |
Выход:
Шаг 6: Мы можем создать собственные теги, а затем добавить их в список тегов HTML, используя свойство tagList tagList : HTML.tags..add('flutter'). Как и здесь, мы создаем собственный тэг 'flutter' и добавляем его в список тэгов HTML. Например: <флаттер></флаттер>
Нам нужно присвоить данные HTML свойству данных виджета HTML().
Каждый тег HTML, будь то тег таблицы или тег упорядоченного списка, поддерживается вместе с настраиваемой функциональностью тегов. Также в свойстве стиля виджета HTML() мы можем задать стили тегам HTML и пользовательским тегам. Мы также можем добавлять стили к изображениям, отображаемым из сетей и доменов. Для лучшего понимания см. приведенный ниже код.
Исходный код:
Dart
void main() { import "package:flutter/material.dart" ; import "package:flutter_html/flutter_html.dart" ; void main() => runApp( new MyApp()); class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return new MaterialApp( debugShowCheckedModeBanner: false , title: "Flutter Tutorial" , theme: new ThemeData( primarySwatch: Colors.green, ), home: MyHomePage(), ); } } class MyHomePage extends StatefulWidget { @override _MyHomePageState createState() => new _MyHomePageState(); } const htmlData = r "" " <body style= "background-color:powderblue;" > <h3>Support for math equations:</h3> Solve for <var>x<sub>n</sub></var>: log <sub>2</sub>(<var>x</var><sup>2</sup>+<var>n</var>) = 9<sup>3</sup> <h3>Inline Styles:</h3> <p>This should be <span style= "color: blue;" >BLUE style= "color: blue;" </span></p> <h3>Table support (with custom styling!):</h3> <table> <colgroup> <col width= "50%" /> <col span= "2" width= "25%" /> </colgroup> <thead> <tr><th>One</th><th>Two</th><th>Three</th></tr> </thead> <tbody> <tr> <td rowspan= "2" >Rowspan</td><td>Data</td><td>Data</td> </tr> <tr> <td colspan= "2" ><img alt= "Google" src= "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_92x30dp.png" /></td> </tr> </tbody> <tfoot> <tr><td>fData</td><td>fData</td><td>fData</td></tr> </tfoot> </table> <h4>Below is the custom tag: Flutter tag</h4> <flutter vertical></flutter> <h3>List support:</h3> <ol> <li>This</li> <li> <p>is</p> </li> <li> ordered <ul> <li>This is a</li> <li>nested</li> <li>unordered list </li> </ul> </li> </ol> <h3>Images are also supported:</h3> <h3>Network png</h3> <img src= "https://res.cloudinary.com/nitishk72/image/upload/v1586796259/nstack_in/courses/flutter/flutter-banner.png" > <h3>Network svg</h3> <h3>Data uri (with base64 support)</h3> <img alt= "Red dot (png)" src= "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" /> <img alt= "Green dot (base64 svg)" src= "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2aWV3Qm94PSIwIDAgMzAgMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjE1IiBjeT0iMTAiIHI9IjEwIiBmaWxsPSJncmVlbiIvPgo8L3N2Zz4=" /> <img alt= "Green dot (plain svg)" src= "data:image/svg+xml,%3C?xml version="1.0" encoding="UTF-8"?%3E%3Csvg viewBox="0 0 30 20" xmlns="http://www.w3.org/2000/svg"%3E%3Ccircle cx="15" cy="10" r="10" fill="yellow"/%3E%3C/svg%3E" /> "" "; class _MyHomePageState extends State<MyHomePage> { @override Widget build(BuildContext context) { return new Scaffold( appBar: AppBar( title: Text( "GeeksForGeeks" ), centerTitle: true , ), body: SingleChildScrollView( child: Html( data: htmlData, tagsList: Html.tags..add( "flutter" ), style: { // add style to the tags in HTML code "table" : Style( backgroundColor: Color.fromARGB(0x50, 0xee, 0xee, 0xee), ), "tr" : Style( border: Border(bottom: BorderSide(color: Colors.grey)), ), "th" : Style( padding: EdgeInsets.all(6), backgroundColor: Colors.grey, ), "td" : Style( padding: EdgeInsets.all(6), alignment: Alignment.topLeft, ), "h5" : Style(maxLines: 2, textOverflow: TextOverflow.ellipsis), }, customRender: { "table" : (context, child) { return SingleChildScrollView( scrollDirection: Axis.horizontal, child: (context.tree as TableLayoutElement).toWidget(context), ); }, // adding customizable tag "flutter" : (RenderContext context, Widget child) { // giving style to Flutter tag with FlutterLogo() widget return FlutterLogo( style: (context.tree.element!.attributes[ "horizontal" ] != null) ? FlutterLogoStyle.horizontal : FlutterLogoStyle.markOnly, textColor: context.style.color!, size: context.style.fontSize!.size! * 5, ); }, }, customImageRenders: { // We can give similar features to elements // from the same domain like for flutter.dev // We can define any number of networkSourceMatcher networkSourceMatcher(domains: [ "flutter.dev" ]): (context, attributes, element) { return FlutterLogo(size: 36); }, networkSourceMatcher(domains: [ "mydomain.com" ]): networkImageRender( headers: { "Custom-Header" : "some-value" }, altWidget: (alt) => Text(alt ?? "" ), loadingWidget: () => Text( "Loading..." ), ), // If relative paths starts with /wiki, // prefix them with a base url (attr, _) => attr[ "src" ] != null && attr[ "src" ]!.startsWith( "/wiki" ): networkImageRender( // If links for images are broken use Custom placeholder // image networkSourceMatcher(): networkImageRender(altWidget: (_) => FlutterLogo()), }, onCssParseError: (css, messages) { //If error occurs while applying CSS to HTML print( "css that errored: $css" ); print( "error messages:" ); messages.forEach((element) { print(element); }); }, ), ), ); } } |
РЕКОМЕНДУЕМЫЕ СТАТЬИ