宮沢賢治のオールナイトニッポン

アプリ開発/プログラミング学習における厄介事を垂れ流します。flutter/dart/python...

パラメータとしてのアンダースコア (_)/ Underscore as the parameter in【Dart】

dartのコードを見ていると下記のように引数にアンダースコアが置かれている場面にちょくちょく出くわす。

...
testFunc(_) {
    ...
}
...

なにこれ?と思いつつも特に困らなかったので、というか自分で使う場面に出くわさなかったので詳しく調べなかったのだが、ブログのネタとして調べることにしました。

結論からすると、「明示的に、パラメータを使わないことを表している」ということらしい。

dart.dev

f:id:teruponn56:20210331165338p:plain

なるほど、たしかにthenメソッドとか使うときに値を受け取っても使わないことってありますよね。

明示的に、このパラメータは使わないよ、って表現したほうがわかりやすい :)

Shared Preferencesのファイルはどこにあるのか? / Where are Shared Preferences Stored in 【Flutter/Android】?

開発中のアプリにおいて、userの入力したデータをすべてひっくるめて、Google Driveにバックアップする機能を実装しようとしています。

そのなかでShared Preferencesのデータがどこに保存されているのか確認する必要がありました。調べていくと下記のSO記事を見つけました。

stackoverflow.com

いわく、/data/data/PACKAGE NAME/shared_prefs/FlutterSharedPreferences.xml Androidの場合はここにあるよ、と。確かめてみます。 適当なデータをShared Preferences経由で保存し、下記のようにデータにアクセスします。

final file = File(
        '/data/data/MY PACKAGE NAME/shared_prefs/FlutterSharedPreferences.xml');
    String contents = await file.readAsString();

    if (contents != null)
      print(
          'This is /data/data/MY PACKAGE NAME/shared_prefs/FlutterSharedPreferences.xml -> ...\n$contents');
    else
      print('its NULL');

ありました!!!StringList形式と通常のStringのデータがあります。 f:id:teruponn56:20210323131204p:plain 同様にStethoパッケージを使って、Chrome Dev Toolsでも確認をしてみます。はい、もちろん同様のデータが確認できます。StringListのデータだけ、なんか不明な文字列に変換されている仕様なんですよね。最初見たときは、なんか文字化けしてるとおもいました。 :p f:id:teruponn56:20210323131359p:plain

SHA-1 Key取得の方法 / How to get SHA-1 Key on【Win10】

※一番下にGoogle Developers公式のSHA-1 Key確認方法があります。それでつまづいたら、下記の内容を順に確認してみてください :)

FlutterとFireBase連携の際にSHA-1 Keyが必要になりました。備忘録として残します。

VScodeで開発をしているのですが、ちょっと手こずりました。 最初は下記の記事を参考に進めました。

stackoverflow.com gladlew signingReportをプロジェクトのディレクトリでRunさせて、とあります。

ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. と怒られました。

うん、JavaJDKのダウンロードをしていない。 次に見つけたのが下記のYouTube動画です。

www.youtube.com keytool -list -v -keystore C:\Users\USER NAME\.android\debug.keystore -alias androiddebugkey -storepass android -keypass android

このコマンドをC:\Users\USER NAME で走らせるようです。

しかしkeytoolコマンドが認識されません。

そんなこんなで、keytoolが認識されない問題で、下記のSO記事にたどり着きました。

stackoverflow.com C:\Program Files\Java\jdk1******\bin から走らせて、とのことです。JDKをダウンロードして、走らせます。

コマンド keytool は見つかりませんでしたが、現在の場所に存在します。Windows PowerShell は、既定では、現在の場所からコマンドを読み込みません。このコマンドを信頼する場合は、".\keytool" と 入力してください

そうします。

不正なオプション: ...NAME\.android\debug.keystore

pathが正しく認識されていません。"..."で囲います。....いけました😊

f:id:teruponn56:20210322170228p:plain
SHA-1 Key

EDIT:

FireBaseのAndroid登録の画面でTipsとしてSHA-1 Keyの確認方法が詳しく出ていました。下記のリンクです。これが一番わかり易いですね!

developers.google.com

インデックスつきのカルーセルスライダー/Carousel Slider with Indicator 【Flutter】

ルーセルスライダーにインデックスインジケータ(?)を実装したい。

開発中のカルーセルスライダーをいじる機会があったので記録に残します。 下記のパッケージはすごく充実していて、お手軽にカルーセルを実装できます。

pub.dev

f:id:teruponn56:20210321121112p:plain

上記のデモの実装は下記になります。インジケータ部分において、現在表示されていもののインデックスが黒丸で表現されています。

class _CarouselWithIndicatorState extends State<CarouselWithIndicatorDemo> {
  int _current = 0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Carousel with indicator demo')),
      body: Column(
          children: [
            CarouselSlider(
              items: imageSliders,
              options: CarouselOptions(
                  autoPlay: true,
                  enlargeCenterPage: true,
                  aspectRatio: 2.0,
                  onPageChanged: (index, reason) {
                    setState(() {
                      _current = index;
                    });
                  }
              ),
            ),
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: imgList.map((url) {
                int index = imgList.indexOf(url);
                return Container(
                  width: 8.0,
                  height: 8.0,
                  margin: EdgeInsets.symmetric(vertical: 10.0, horizontal: 2.0),
                  decoration: BoxDecoration(
                    shape: BoxShape.circle,
                    color: _current == index
                        ? Color.fromRGBO(0, 0, 0, 0.9)
                        : Color.fromRGBO(0, 0, 0, 0.4),
                  ),
                );
              }).toList(),
            ),
          ]
      ),
    );
  }
}

グレーや黒の丸で表現されている上記のインジケータをいじり、インデックスの数字で表現をしたいと思います。 上記コードのインジケータ実装部ではRow()の子要素としてContainer()で丸を表現したものを返しているだけでしたが、下記のようにStackでまとめて、丸の上からIndexの数字を重ねてやります。

Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: imgList.map((url) {
            int index = imgList.indexOf(url);
            return Stack(children: [
              Container(
                width: 36,
                height: 36,
                margin: EdgeInsets.symmetric(vertical: 10.0, horizontal: 2.0),
                decoration: BoxDecoration(
                  shape: BoxShape.circle,
                  color: _current == index ? Colors.blue : Colors.grey[350],
                ),
              ),
              Container(
                  margin: EdgeInsets.fromLTRB(2, 13, 2, 7),
                  width: 36,
                  height: 36,
                  child: Text('${index + 1}',
                      textAlign: TextAlign.center,
                      style: TextStyle(
                          color: Colors.black,
                          fontSize: 24,
                          fontWeight: FontWeight.bold)))
            ]);
          }).toList(),
        )

こんなかんじで実装できました☺

f:id:teruponn56:20210321130502j:plain

Failed to launch emulator: Error: Emulator didn't connected within 60 seconds 【AndroidStudio/VScode】

flutter アプリで上記のエラーが出て、エミュレータが立ち上がらない。

>実機接続では普通にビルドできる。

結局下記のstackoverflow全能神が解決してくれた。stackoverflow.com

  • Open Android Studio Tools -> AVD Manager Virtual Device -> Actions Click On Wipe data

おそらくエミュレータにキャシュデータやらが蓄積しすぎていた様子。

上記を実行すると、VScodeでもエミュレータが立ち上がるようになった。

udacityとかcodelabとかいっぱいやってたからね。

wipeしたあとはsizeが4GBになったけど、ビルドしたらすぐ9.5までいった。

確かwipeする前は12GBだった。意外とこまめにwipeしないといけないのかな。

f:id:teruponn56:20210223000248p:plain

wipeして、再度ビルドしたあとのAVD Manager

どうでもいいけれど、ASとVScodeはおんなじエミュレータなんですね。

ありがとう、全能神。:)