Twitterを救いたい！FlutterでTwitterクライアントアプリを作った

Twitterの改革に備えてTwitterのクライアントアプリをFlutterで作成し、
AndroidアプリをPlay Storeでリリースしたので、
その経緯と作るのに使用した技術などを紹介していきたいと思います。
あとちょっと変わった機能をつけたので、それも紹介したいと思います。

# なぜ今Twitterクライアントアプリを作ったのか？
Twitterクライアントアプリを作ろうと思い立つまでの思考の流れです。
興味ない方はこの章を飛ばしてください。
ものづくりしたいけどアイディアが思い浮かばないと言う人は、もしかしたらこのアプリのアイディアが生まれるまでの思考の流れが参考になるかもしれないので、一応アイディアが生まれるところから書いていこうと思います。

### Twitter
僕のスマホの使用時間の中でTwitterに割かれる時間は長いです。
Twitterの説明は不要だと思いますが、Twitterは多くの人と交流するためのアプリです。
ユーザーはツイートを投稿することができます。そのツイートをフォロワーが見てリプしたり、いいねしたり、リツイートしたりして自分とコミュニティの人だけでなく、離れたコミュニティにいる人とも繋がることができます。
これが当たり前になっていますが、よく考えるとこれってすごいことですよね。
Twitterのヘビーユーザー（ツイ廃）にはもう10年以上Twitterを続けている人が多く、今のTwitterのコミュニティを作るのにそれだけの年月がかかっていることになります。

### そんなTwitterが危ない
10月27日イーロン・マスク氏がTwitterを買収すると、1日あたり400万ドル以上の損失を出している状況を脱却するために、社員の大量解雇やサブスク機能の追加など大きな改革を行いはじめました。
この改革はおそらくユーザーにも大きな影響を与えるでしょう。

### Twitterを続けるためには
Twitterを続けていくにはイーロン・マスク氏による改革によってTwitterが赤字から脱却し、わたしたちはその改革の中でTwitterを続けていくしかない。
**改革によって色々な機能が追加されたり、TwitterアプリのUIが変わったり、タイムラインの表示順のアルゴリズムが変わったりするかもしれない。
そういったものはもしかしたら自分にとってはTwitterを使いづらいものにするかもしれない。**
***なら自分で使いやすいTwitterアプリを作ってしまえばいいんだ***
Twitter APIの仕様変更などで突然作ったアプリが使えなくなることもあるかもしれませんがとりあえず作ってみました。

# Flutter
今回このアプリを作るのに２・３年ぶりにFlutterを触りました。
２・3年前も軽く触って一本アプリ作ったぐらいの知識しかないのですが、
僕と同じ様に数年ぶりに2・3年ぶりにFlutterに触る人に、
僕が感じた昔との違いを紹介していきたいと思います。

### NullSafety
変数宣言時に型に?をつけてNullが入ることを許可しないと、
変数にNullを代入できないようになりました。

### Riverpod(Package)
久しぶりにFlutterを触って一番戸惑ったのは、Riverpodを使った状態管理です。
別に必ずRiverpodを使った状態管理ですを使って状態管理を行うする必要はないのですが、
Riverpodを使うと状態変更時の再描画が非常に便利になります。

https://riverpod.dev/

### Freezed(Package)
Riverpodで状態を管理するクラスはimmutable（不変）クラスである必要があります。
そこでクラスをimuutableにし、copyWith・toString・fromJson・toJsonなどの
よく使われるメソッドを自動で生成してくれるのがFreezedというパッケージです。

https://pub.dev/packages/freezed

# Twitter API
Twitterクライアントアプリ作成するのに多くの場合は、TwitterAPIを使用すると思います。
今回はFlutterでTwitter API v2を利用するのに、
twitter_login・twitter_api_v2の２つのパッケージを使っています。

https://pub.dev/packages/twitter_login

https://pub.dev/packages/twitter_api_v2


### Twitter API v1.1 と Twitter API v2
Twitter APIには v1.1とv2があり、どちらを使用するか慎重に検討する必要があります。
TwitterAPIはv2はv1.1の機能を全て使えるわけではありません。しかしv2でしか使えない機能もあります。
たとえばv2では、自分が特定のユーザーをフォローしているかどうかのRelationshipを確認することができません。
詳しくは、下のページが参考になります。

https://developer.twitter.com/en/docs/twitter-api/migrate/data-formats/standard-v1-1-to-v2

### 絵文字
ツイートを表示するときにこのままでは、表示されない絵文字が出てきてしまいます。
Twitterには、Twemojiという独自の絵文字ライブラリを使用していますこれを表示するのに、
twemojiというパッケージを使うと簡単に表示することができます。

https://pub.dev/packages/twemoji

# こだわり機能
Twitterのクライアントアプリはすでにいくつかあるのですが、
今回それらのアプリにはない、オリジナルの機能をつけました。

### 報酬広告型
Twitterの公式アプリや多くのクライアントアプリの広告の表示方法は、
タイムラインのツイートの間に広告を挟んだり、バナー広告をつけたりしています。
しかし自分は、タイムラインが表示される画面に広告を表示したくなかったので、
これらとは別の方法で広告を表示する方法を考えました。
それが、admob の　Reward ad　で広告を見たら、
３００ツイート分読み込めるポイントがもらえる報酬広告型です。
広告はまとめて２回以上見てもその分のポイントが与えられるので、
こまめに広告を見るのが嫌な人はまとめて一度にたくさんポイントを貯めることもできます。

https://admob.google.com/intl/ja/home/resources/rewarded-ads-win-for-everyone/

### 非表示ワード
Twitterにはミュート機能がありますが、
ミュート機能は見たくないワードを含むツイートを完全に非表示にしてしまいます。
しかし、このアプリは見たくない単語だけを非表示にして表示しそれ以外の部分を表示し、
もしそのツイートの全文が見たくなったときに表示できるようにしています。
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727171/4f9c031d-4ee6-cad7-8042-61a6904fd0d9.png">

### 複数アカウントの管理
いちいちアカウントを切り替えなくてもいいように設計して、
どのアカウントのタイムラインかに関係なく、
いいねやリツイートなどをどのアカウントで行うか選択できます。
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727171/fe080ce7-9022-9dfa-d460-ee08a4d5543b.png">

# Play Sotreで公開中
Androidの方は是非使ってみてください。
Flutterで開発したので好評ならiOSでもリリースしたいと思います。

https://play.google.com/store/apps/details?id=hanullapp.jp.mukudori&hl=ja&gl=US