Serverpod Authentication の行間を読む〜遷移
上級者の説明からこぼれ落ちる細部
身の程知らずな挑戦を続ける独学者にとって大変なのは、
説明の内容が難しいのではなく、
説明してくれていないところがわからない、ということだ。
Full Stack Dartを目指すServerpod、
Serverpod自体の説明は丁寧なので、がんばればついて行ける。
けれども、これ使うほどのエンジニアなら当然知ってるでしょ、ということは説明してくれない。
それで立ち往生する。
どこにもいけない
SeverpodのAuthenticationはなかなか親切で、
(他は知らないので、特別なわけではないかもしれないが)
いろんな機能(詳しくはわからない)がセットになったmoduleを入れさえすれば
様々なことをよしなに取り計らってくれる、らしい。
E-mailやGoogleでのログインボタンなんかも、もれなくついてくる。
例えばSignInWithEmailButton()をクリックすると
入力画面が開いて、いろいろ入力すればsignUp完了、DBにちゃんとuserとして登録される。
おお、簡単。
ところが、そこから、うんともすんとも動かない。
user感覚が抜けないので、signUpしたら次に進めよ、と思ってしまうが、進まない。
えーいと思ってやり直すと、
「もうsignInしてますね」という感じでいきなりAccountPageに入る、
のだが、ここからもどこへも行けない。
ここにはsignOutというButtonがあるので、それを押すと、
terminalではサインアウトしたと表示されるけど、これもどこへも行かない。
考えてみたら当たり前のことで、
ここから先は、それぞれのアプリで挙動が違うだろう。
どこへ行くかは勝手に決めてよね、ということだ。
ここまでが親切すぎたので、油断した・・・。
まずはsignUp signInしたときの遷移。
                  Padding(
                    padding: const EdgeInsets.all(8.0),
                    child: SignInWithEmailButton(
                      caller: client.modules.auth,
		      
		      ///ここから先がtutorialにはなかったので追加。
                      onSignedIn: () { 
                        Navigator.push<String>(
                          context,
                          MaterialPageRoute(
                            builder: (context) => const AccountPage(),
                          ),
                        );
                      },
                    ),
                  ),
つぎはsignOutしたときの遷移
              Padding(
                padding: const EdgeInsets.all(16),
                child: ElevatedButton(
                  onPressed: () {
                    sessionManager.signOut();
		    
		    ///ここから先がtutorialになかったので追加。
                    Navigator.push<String>(
                      context,
                      MaterialPageRoute(
                        builder: (context) => const SignInPage(),
                      ),
                    );
                  },
                  child: const Text('Sign out'),
                ),
              ),
signInしたまま先に進むには
FloatingActionButtonをつけました。ふつうのButtonでもいいかもね。
ちなみにAccountPageで遭遇したもう一つの問題
tutorialで、
AccountPageというfileをつくって、これを貼り付けてね、
といわれるコードを貼り付けると、
「いきなりListViewとかいうな!」と怒られます。
tutorialのcodeはこんな感じ
import 'package:flutter/material.dart';
import 'package:serverpod_auth_shared_flutter/serverpod_auth_shared_flutter.dart';
import 'package:my_project_flutter/src/serverpod_client.dart';
class AccountPage extends StatelessWidget {
  const AccountPage({Key? key}) : super(key: key);
  
  Widget build(BuildContext context) {
    return ListView(
      children: [
        ListTile(
          contentPadding:
              const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
          leading: CircularUserImage(
            userInfo: sessionManager.signedInUser,
            size: 42,
          ),
          title: Text(sessionManager.signedInUser!.userName),
          subtitle: Text(sessionManager.signedInUser!.email ?? ''),
        ),
        Padding(
          padding: const EdgeInsets.all(16),
          child: ElevatedButton(
            onPressed: () {
              sessionManager.signOut();
            },
            child: const Text('Sign out'),
          ),
        ),
      ],
    );
  }
}
ListViewをScaffoldでwrapしたら動きました。
知らないって、悲しい。
でも、一つ一つわかっていくのは楽しいです。
今回はこの記事にそって挑戦中。
clearしたら、またご報告します。
Discussion