前提・実現したいこと
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
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。