🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

Q&A

1回答

1317閲覧

dartの継承(extend)の実装方法がわかりません。

Inete6Q

総合スコア18

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

0グッド

0クリップ

投稿2021/02/10 14:44

前提・実現したいこと

dartの継承(extend)を実装しようとしています。
flutterのweb_view_flutterパッケージでpdfを読み取りたく、googleDocsビューアで読み込もうとしています。
(参考にしたURL [Flutter]PDFを開く方法まとめ
そこで以下のメソッドをweb_view_flutterのパッケージ使用のコードのどこかに追加しようとしています。

dart

1 final String googleDocs = "https://docs.google.com/viewer?url="; 2 static String createLoadUrl(String url) { 3 if (Platform.isAndroid) { 4 return googleDocs + url; 5 } else { 6 return url; 7 } 8 }

元々は下記のようなコードです。

dart

1import 'package:flutter/material.dart'; 2import 'package:webview_flutter/webview_flutter.dart'; 3 4class SamplePage extends StatefulWidget { 5 6 _SamplePageState createState() => _SamplePageState(); 7} 8 9class _SamplePageState extends State<SamplePage> { 10 static const _initialUrl = ''; 11 12 WebViewController _controller; 13 14 15 void initState() { 16 super.initState(); 17 } 18 19 20 void dispose() { 21 super.dispose(); 22 } 23 24 25 Widget build(BuildContext context) { 26 return Column( 27 children: [ 28 Expanded( 29 flex: 1, 30 child: WebView( 31 initialUrl: _SamplePageState._initialUrl, 32 javascriptMode: JavascriptMode.unrestricted, 33 onWebViewCreated: (WebViewController webViewController){ 34 _controller = webViewController; 35 }, 36 )), 37 Container( 38 color: Colors.white, 39 height: 20, 40 //省略 41 ), 42 ), 43 ], 44 ); 45 } 46} 47

このコードに上記のコードを追加したく、web_view_flutter.dartを読んでいたら下記コードを見つけたのでここのloadUrlメソッドで読み込んでいるのかなと見当つけました。

class WebViewController { WebViewController._( this._widget, this._webViewPlatformController, this._platformCallbacksHandler, ) : assert(_webViewPlatformController != null) { _settings = _webSettingsFromWidget(_widget); } final WebViewPlatformController _webViewPlatformController; final _PlatformCallbacksHandler _platformCallbacksHandler; late WebSettings _settings; WebView _widget; /// Loads the specified URL. /// /// If `headers` is not null and the URL is an HTTP URL, the key value paris in `headers` will /// be added as key value pairs of HTTP headers for the request. /// /// `url` must not be null. /// /// Throws an ArgumentError if `url` is not a valid URL string. Future<void> loadUrl( String url, { Map<String, String>? headers, }) async { assert(url != null); _validateUrlString(url); return _webViewPlatformController.loadUrl(url, headers); }

プログラミングにあまり慣れていないのもあり、packageの中身をいじるのは避けたかったので、継承しようと下記コードに修正した際にエラーが出てしまいました。

import 'package:flutter/material.dart'; import 'package:webview_flutter/webview_flutter.dart'; class SamplePage extends StatefulWidget { @override _SamplePageState createState() => _SamplePageState(); } class _SamplePageState extends State<SamplePage> { static const _initialUrl = 'https://www.google.com/?hl=ja'; WebAndPdfViewController _controller; @override void initState() { super.initState(); } @override void dispose() { super.dispose(); } @override Widget build(BuildContext context) { return Column( children: [ Expanded( flex: 1, child: WebView( initialUrl: _SamplePageState._initialUrl, javascriptMode: JavascriptMode.unrestricted, onWebViewCreated: (WebAndPdfViewController webViewController){ _controller = webViewController; }, )), Container( color: Colors.white, height: 20, //省略 ), ), ], ); } } class WebAndPdfViewController extends WebViewController{ //下記super部分でエラー WebAndPdfViewController():super(); final String googleDocs = "https://docs.google.com/viewer?url="; @override Future<void> loadUrl(String url, {Map<String, String> headers}){ final String newUrl = createLoadUrl(url) return super.loadUrl(newUrl, headers); } String createLoadUrl(String url) { if (Platform.isAndroid) { return googleDocs + url; } else { return url; } } }

この方法でpdfを読み込めなかったとしても継承の実装方法が知りたいです。
またもっといいwebviewをつかっている際にpdfを開くことになった場合のよりよい方法があれば教えていただけると助かります。

発生している問題・エラーメッセージ

The class 'WebViewController' doen't have an unnamed constructor. Try defining an unnamed constructor in 'WebViewController', or invoking a different constructor.

補足情報(FW/ツールのバージョンなど)

webview_flutter: ^1.0.7

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

WebViewControllerは継承する前提で設計されていないと思います。
WebViewを操作するために使うものです。

投稿2021/02/14 09:42

hiroshihorie

総合スコア192

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問