Cách thêm HTML nội tuyến trong Webview Flutter

Ảnh của Ahmad Odeh trên Unsplash

Tôi nghĩ bạn cũng sẽ nhảy sau khi xem hình ảnh trên 'vì tôi đang ở ngay bây giờ! Haha…

Được rồi, trở lại công việc của ngày hôm nay… Tôi sẽ không nói hết về “ tạo một ứng dụng rung động, blah blah blah ”. Tôi tin rằng bạn có thể hoặc đã tạo một ứng dụng Flutter rồi, tôi tin vào Bạn!

Bây giờ tôi có tệp phi tiêu có tên: Webview.dart.

import 'package:flutter/material.dart';

class Webview extends StatefulWidget {
  @override
  _WebviewState createState() => _WebviewState();
}

class _WebviewState extends State<Webview> {
  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

dependencies:
  flutter:
    sdk: flutter


  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^1.0.2
  webview_flutter: ^2.0.9

dev_dependencies:
  flutter_test:
    sdk: flutter

defaultConfig {
    // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
    applicationId "connelblaze.cb.ranqz"
    minSdkVersion 20
    targetSdkVersion 30
    versionCode flutterVersionCode.toInteger()
    versionName flutterVersionName
}

<manifest...
>
<uses-permission android:name="android.permission.INTERNET" />
...
<application

import 'package:flutter/material.dart';
import 'package:ranqz/screen/Home.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(

        primarySwatch: Colors.blue,
      ),
      home: Home(),
    );
  }
}

import 'package:flutter/material.dart';
import 'package:ranqz/screen/Webview.dart';

class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home'),
      ),
      body: Container(
        child: Center(
          child: GestureDetector(
            onTap: () {
              Navigator.push(context, MaterialPageRoute(builder: (context) => Webview()));

            },
            child: Text("Go to webview"),
          ),
        ),
      ),
    );
  }
}

import 'dart:async';
import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';

class Webview extends StatefulWidget {
  @override
  _WebviewState createState() => _WebviewState();
}

class _WebviewState extends State<Webview> {
  final Completer<WebViewController> _controller =
  Completer<WebViewController>();
  WebViewController _con;

  /*
  *
  * Webview
  * */

  String setHTML(String email, String phone, String name) {
    return ('''
    <html>
      <head>
        <!-- Required meta tags -->
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
      </head>
      
        <body style="background-color:#fff;height:100vh ">

          <div style="width: 50%; margin: 0 auto;margin-top: 200px">
            <table class="table table-striped">
              <tbody>
                <tr>
                  <th>Name</th>
                  <th>$name</th>
                </tr>
                <tr>
                  <th>Email</th>
                  <td>$email</td>
                </tr>
                <tr>
                  <th>Phone</th>
                  <th>$phone</th>
                </tr>
              </tbody>
            </table>
            <a type="button" class="btn btn-success" style="width: 210px" href="https://connelevalsam.github.io/connelblaze/">
              Submit
            </a>
          </div>
        </body>
      </html>
      

    ''');
  }

  _printz() => print("Hello");

  _loadHTML() async {
    _con.loadUrl(Uri.dataFromString(
        setHTML(
          "[email protected]",
          "+2347034857296",
          "Connel Asikong"
        ),
        mimeType: 'text/html',
        encoding: Encoding.getByName('utf-8')
    ).toString());
  }


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Webview'),
      ),
      body: Builder(builder: (BuildContext context) {
        return WebView(
          initialUrl: 'https://flutter.dev',
          javascriptMode: JavascriptMode.unrestricted,
          onWebViewCreated: (WebViewController webViewController) {
            // _controller.complete(webViewController);
            _con = webViewController;
            _loadHTML();
          },
          onProgress: (int progress) {
            print("WebView is loading (progress : $progress%)");
          },
          navigationDelegate: (NavigationRequest request) {
            if (request.url.startsWith('https://www.youtube.com/')) {
              print('blocking navigation to $request}');
              return NavigationDecision.prevent;
            }
            print('allowing navigation to $request');
            return NavigationDecision.navigate;
          },
          onPageStarted: (String url) {
            print('Page started loading: $url');
          },
          onPageFinished: (String url) {
            print('Page finished loading: $url');
          },
          gestureNavigationEnabled: true,
        );
      }),
    );
  }

}

Dù sao, bạn có bất kỳ nhận xét hoặc bất cứ điều gì để nói, đánh tôi lên.
Hoặc bạn muốn tặng cho nam alpha thanh lịch trẻ trung cực kỳ đẹp trai này… Bạn vẫn có thể đánh tôi!

Đây là phần 2, sử dụng Javascript

cổ vũ và tiếp tục viết mã!

Suggested posts

Android | Gboard đã được làm mới với giao diện mới dành cho máy tính bảng

Google đã làm mới cách bố trí bàn phím đúng lúc ra mắt Pixel Fold và Pixel Tab.

Android | Gboard đã được làm mới với giao diện mới dành cho máy tính bảng

Google gần đây đã cập nhật ứng dụng bàn phím Gboard cho Android để bao gồm một bố cục mới được tối ưu hóa cho máy tính bảng. Tôi nhận thấy sáng nay rằng tôi gặp một số khó khăn khi gõ và khi kiểm tra kỹ hơn, tôi nhận ra rằng bàn phím đã bị thay đổi.

Google | I/O là gì?

Google đã chọn một cái tên thú vị cho hội nghị các nhà phát triển hàng năm của mình.

Google | I/O là gì?

Tên "I/O" là viết tắt của đầu vào và đầu ra. Lúc đầu, tôi bị nhầm lẫn bởi cái tên này, nhưng sau khi tra cứu nó trên Wikipedia, tôi nhận ra rằng đó là một từ viết tắt đơn giản và dễ hiểu.

Related posts

Cuộc trò chuyện nguy hiểm

Cuộc trò chuyện nguy hiểm

Nếu chúng ta muốn tiếp tục phát triển trên hành tinh này, chúng ta sẽ phải có những cuộc đối thoại nguy hiểm. Những thứ thách thức những gì chúng ta đã làm, những gì chúng ta đang làm và những gì chúng ta hiện đang chuẩn bị tiếp tục làm (hoặc đang có kế hoạch làm).

Học tập trong tuần làm việc quan trọng hơn bạn nghĩ

Học tập trong tuần làm việc quan trọng hơn bạn nghĩ

Chúng ta thường thấy mình phải vật lộn để thực hiện những gì chúng ta biết là tốt cho chúng ta. Từ việc nói với một người quan trọng khác rằng chúng ta yêu họ đến việc nhớ nói chuyện như một tên cướp biển, sẽ luôn có những người cho rằng không cần thiết phải tổ chức các sự kiện trong ngày, tuần hoặc tháng vì họ đã làm những việc đó rồi.

CUỘC SỐNG KHÔNG GIỚI HẠN

Khi bạn lớn lên, bạn có xu hướng được bảo rằng thế giới là như vậy và cuộc sống của bạn chỉ là sống cuộc sống của bạn trong thế giới, không bao giờ mạo hiểm cuộc sống của bạn, chỉ cần đi theo một con đường đã định sẵn và cuối cùng sẽ chết, và cố gắng không bash the wall too much.But that's a very limited life.

Thu thập OSINT để săn lùng mối đe dọa

Thu thập OSINT để săn lùng mối đe dọa

Xin chào, những người đam mê mạng! Chào mừng bạn quay trở lại OSINT cho loạt bài săn tìm mối đe dọa. Trong bài viết đầu tiên, tôi đã cung cấp cho bạn cái nhìn tổng quan về OSINT và tầm quan trọng của nó trong việc tìm kiếm mối đe dọa.