📱

flutter:WebViewをインストール

2024/09/07に公開

インストール・インポート

インストール

$ flutter pub add webview_flutter

インポート

import 'package:webview_flutter/webview_flutter.dart';

コード例

StatefulWidgetでのコード記入例を挙げます.

  • Stateクラス内でWebViewWidgetControllerのインスタンスを作成
var loadingPercentage = 0;
var isLoading = true;
var hasError = false;
controller = WebViewController()
      ..setNavigationDelegate(NavigationDelegate(onPageStarted: (url) {
        setState(() {
          loadingPercentage = 0;
          isLoading = true;
          hasError = false;
        });
      }, onProgress: (progress) { // ローディング時
        setState(() {
          loadingPercentage = progress;
        });
      }, onPageFinished: (url) { // ローディングが終わった時
        setState(() {
          loadingPercentage = 100;
          isLoading = false;
        });
      }, onWebResourceError: (error) { // エラーが起こった時
        setState(() {
          debugPrint(error.toString());
          hasError = true;
          isLoading = false;
        });
      }))
      ..setJavaScriptMode(JavaScriptMode.unrestricted)
      ..loadRequest(
        // ここに表示したいサイトのURLを設定
        Uri.parse(""),
      );
  • WebViewWidgetにcontrollerインスタンスを渡す.

  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: PageTitle(pageTitleName: widget.recipeDishName),
        backgroundColor: CommonColors.primaryColor,
      ),
      body: hasError
          // エラーが発生した場合の表示
          ? Container(
              color: CommonColors.pageBackgroundColor,
              child: Center(
                  child: Column(
                mainAxisSize: MainAxisSize.max,
                children: [
                  const Gap(20),
                  const Text(
                    'ページの読み込みに失敗しました。',
                    style: TextStyle(color: Colors.red, fontSize: 20),
                  ),
                  const Gap(20),
                  ElevatedButton(
                    onPressed: () {
                      setState(() {
                        hasError = false;
                        isLoading = true;
                      });
                      controller.loadRequest(Uri.parse(widget.recipeUrl));
                    },
                    child: const Text('再度ページを読み込む'),
                  ),
                ],
              )),
            )
          // エラーが発生していない場合の表示
          : Stack(
              children: [
                WebViewWidget(
                  controller: controller,
                ),
                if (isLoading)
                  LinearProgressIndicator(
                    value: loadingPercentage / 100.0,
                  ),
              ],
            ),
    );
  }

参考資料

https://codelabs.developers.google.com/codelabs/flutter-webview

https://pub.dev/packages/webview_flutter/install

https://pub.dev/packages/webview_flutter

Discussion