質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Flutter

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

Dart

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

Q&A

解決済

2回答

919閲覧

package:url_launcherの使用過程でエラーが表示される

piko_piko_head

総合スコア5

Flutter

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

Dart

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

0グッド

0クリップ

投稿2023/03/10 15:02

編集2023/03/10 15:11

実現したいこと

package:url_launcherを利用してメーラーを起動させる。

前提

スマホで動くアプリを作ろう!ゼロから始めるFlutter実践入門編 ②: 様々なパッケージを使ってみよう(渋谷 エミリ 著)
↑上記、書籍でFlutterの学習中です。
packageの利用方法が説明されている箇所で、url_launcherを使用しています。
書籍の中で掲示されているサンプルコードがエラーになってしまい、対処法がわからず困っております。

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

Dart

1: Error: The argument type 'Uri' can't be assigned to the parameter type 'String'. 2main.dart:17 3 - 'Uri' is from 'dart:core'. 4 if (!await launchURL(Uri.parse(url))) { 5 ^ 6: Error: This expression has type 'void' and can't be used. 7main.dart:17 8 if (!await launchURL(Uri.parse(url))) { 9 ^ 10: Error: The argument type 'String' can't be assigned to the parameter type 'Uri'. 11main.dart:41 12 - 'Uri' is from 'dart:core'. 13 launchUrl('mailto:${mailAddress}?subject=${mailTitle}&body=${mailContents}');

該当のソースコード

Dart

1import 'package:flutter/material.dart'; 2import 'package:url_launcher/url_launcher.dart'; 3import 'package:url_launcher/link.dart'; 4 5void main() { 6 runApp(myApp()); 7} 8 9class myApp extends StatelessWidget { 10 const myApp({Key? key}) : super(key: key); 11 12 final String mailAddress = 'hoge@ne.jp'; 13 final String mailTitle = '件名です'; 14 final String mailContents = '本文です'; 15 16 Future<void> launchURL(String url) async { 17 if (!await launchURL(Uri.parse(url))) { 18 throw '${url}が表示されません'; 19 } 20 } 21 22 23 Widget build(BuildContext context) { 24 return MaterialApp( 25 home: Scaffold( 26 appBar: AppBar( 27 centerTitle: true, // 中央寄せを設定 28 title: Text('My Profile'), 29 ), 30 body: Center( 31 child: Column( 32 children: [ 33 Image.asset('assets/icon.png', height: 200), 34 Text('hoge hogeo'), 35 Row(children: [Text('所属:'), Text('株式会社hoge')]), 36 Row(children: [Text('電話:'), Text('090-0000-0000')]), 37 Row(children: [ 38 Text('メール:'), 39 Text('hoge@ne.jp'), 40 TextButton(onPressed: () async { 41 launchUrl('mailto:${mailAddress}?subject=${mailTitle}&body=${mailContents}'); 42 }, child: Icon(Icons.mail))]), 43 Row(children: [Text('WebSite:'), Text('http://hoge.com')]), 44 ], 45 ), 46 ), 47 ), 48 ); 49 } 50} 51

試したこと

https://pub.dev/packages/url_launcherや、同ページ内の例を参照したが、具体的な対処法がわからなかった。
・final String url= 'www.hoge.com';とurlにあらかじめ値を入力させたがエラー表示となった。

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

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

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

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

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

guest

回答2

0

自己解決

解決しました。
関数名のlaunchURLとlaunchUrlメソッドを混同しておりました。

Dart

1 Future<void> launchURL(String url) async { 2 if (!await launchUrl(Uri.parse(url))) { 3 throw '${url}が表示されません'; 4 } 5 }

投稿2023/03/10 17:10

piko_piko_head

総合スコア5

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

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

0

エラーの原因は、launchURLメソッドの引数をString型で定義しているため、Uri.parseメソッドで変換されたUri型の値が直接渡せず、エラーが発生していることだと思います。また、launchUrlメソッドも定義されていないため、エラーが発生しているのではないでしょうか?

下のように修正するとうまくいくと思います。

import 'package:flutter/material.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/link.dart'; void main() { runApp(myApp()); } class myApp extends StatelessWidget { const myApp({Key? key}) : super(key: key); final String mailAddress = 'hoge@ne.jp'; final String mailTitle = '件名です'; final String mailContents = '本文です'; Future<void> launchURL(Uri uri) async { if (!await canLaunch(uri.toString())) { throw '${uri.toString()}が表示されません'; } await launch(uri.toString()); } @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( centerTitle: true, // 中央寄せを設定 title: Text('My Profile'), ), body: Center( child: Column( children: [ Image.asset('assets/icon.png', height: 200), Text('hoge hogeo'), Row(children: [Text('所属:'), Text('株式会社hoge')]), Row(children: [Text('電話:'), Text('090-0000-0000')]), Row(children: [ Text('メール:'), TextButton( onPressed: () async { await launchURL(Uri.parse( 'mailto:${mailAddress}?subject=${mailTitle}&body=${mailContents}')); }, child: Icon(Icons.mail), ) ]), Row(children: [Text('WebSite:'), Text('http://more.com')]), ], ), ), ), ); } }

投稿2023/03/10 15:13

num544

総合スコア13

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

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

piko_piko_head

2023/03/10 16:01

ありがとうございます。 Stringで定義したものを、Uriで受け取るために、launchURL(Uri.parse(url)としているのだと理解していたのですが、これが間違っているのでしょうか。 ご教示いただいたコードでデバッグしてみましたが 下記エラーメッセージが表示されました。 なぜかStringと言われています・・・。 Future<void> launchURL(Uri uri) async { if (!await launchURL(uri.toString())) { throw '${uri.toString()}が表示されません'; } await launchURL(uri.toString()); } ◆以下エラーメッセージ : Error: The argument type 'String' can't be assigned to the parameter type 'Uri'. main.dart:17 - 'Uri' is from 'dart:core'. if (!await launchURL(uri.toString())) { ^ : Error: This expression has type 'void' and can't be used. main.dart:17 if (!await launchURL(uri.toString())) { ^ : Error: The argument type 'String' can't be assigned to the parameter type 'Uri'. main.dart:20 - 'Uri' is from 'dart:core'. await launchURL(uri.toString());
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問