【FlutterWeb】URLパラメータを使いたい!
URLパラメータとは
そんなもん知ってるわという方は読み飛ばしてください。
URL パラメータとは、データを収集するために URL の末尾に付け加える変数のことです。
具体的には、URL の「?」以降がこれにあたります。
たとえば以下のようなURL。
http://localhost:○○○○○/?id=123
今回のURLだとidは123となっており、123をプログラムの引数として扱えて便利なわけです。idによって表示する画面を変えるなんてことも可能になります。例えばユーザーのマイページを表示するケースとかに使われていると思います。
ちなみに、URL関係を調べているとたまにURIっていうのが出てきててタイプミスかななんて思っていましたが、少し定義が違う様です。
URL(Uniform Resource Locator)はweb上の住所
URN(Uniform Resource Name)はWeb側で認識されている名前
URI(Uniform Resource Identifier)はURLとURNの総称
少し脱線しましたが、本題に入っていきます。
やっていくこと
今回はとりあえずローカル環境で動くように設定していきます。FlutterWebアプリをChromeでビルドした後に
http://localhost:○○○○○/?id=123
をブラウザから検索すればFlutterWebアプリ上で123を引数として扱えるようにします。もちろん123だけでなく任意の文字をいれることができます。
完成品
ソースコード
完成品はGithubにあげています。
解説
URLの取得方法について簡単に紹介します。標準ライブラリのUriクラスを活用します。
URL全体の取得
まずは現在のURLを取得するメソッドを紹介します。
//URL取得
String myurl = Uri.base.toString();
これでmyurlにはhttp://localhost:○○○○○/?id=123が入ります。
URLパラメータのみ取得
//クエリパラメータ取得
String? id = Uri.base.queryParameters["id"];
これでidには123が入ります。今回はqueryParametersのkeyが”id”にしましたが任意に決めれます
コード全文
URLを取得できたらあとは表示させるだけです。
import 'package:flutter/material.dart';
void main() {
//URL取得
String myurl = Uri.base.toString();
//クエリパラメータ取得
String? id = Uri.base.queryParameters["id"];
runApp(MyApp(myurl: myurl, id: id ?? 'null'));
}
class MyApp extends StatefulWidget {
String? myurl, id;
MyApp({this.myurl, this.id});
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
Widget build(BuildContext context) {
return MaterialApp(
title: "Test App",
home: Scaffold(
appBar: AppBar(
title: Text("Flutter webページだよ"),
backgroundColor: Colors.redAccent,
),
body: Container(
padding: EdgeInsets.all(20),
alignment: Alignment.center,
child: Column(
children: [
//display parameters and URL here
SelectableText(
widget.id == null ? "id is null" : "id = " + widget.id!),
SelectableText(widget.myurl == null
? "URl is null"
: "URLパラメータ = " + widget.myurl!)
],
))),
);
}
}
おわりに
結構簡単だったと思います。次は実際にWeb上にデプロイして動かせるか検証していきます。
Discussion
こんにちわ。試してみたのですが
Could not navigate to initial route.
The requested route name was: "/?id=1234"
There was no corresponding route in the app, and therefore the initial route specified will be ignored and "/" will be used instead.
と、認識されないURLでエラーが吐き出されてしまいます。