onAuthStateChangedで起きた問題
DiscordのFlutterチャンネルで質問した内容
code: main.dart
Widget build(BuildContext context) {
return StreamBuilder<User>(
stream: auth().onAuthStateChanged,
builder: (context, snapshot) {
if (!snapshot.hasData) {
return Scaffold(
body: FlatButton(
color: Colors.grey,
onPressed: () => googleLogin(),
child: Text('login')),
);
} else {
return Scaffold(
appBar: AppBar(title: Text('login'), actions: <Widget>[]),
drawer: new Drawer(
child: ListView(
children: <Widget>[
new UserAccountsDrawerHeader(
accountName: new Text(snapshot.data.displayName),
accountEmail: new Text(snapshot.data.email),
currentAccountPicture: new CircleAvatar(
backgroundImage: new NetworkImage(snapshot.data.photoURL),
),
),
new ListTile(
title: new Text('Logout'),
onTap: () => googleLogout(),
),
],
),
),
body: Text(''),
);
}
},
);
}
onAuthStateChangeはサインインしていない場合はnullを返す。上記のコードはsnapshotにデータが有るかどうか、つまりnullかどうかで判断しているので、データを取得中かどうかがわからない。flutterのStreamBuilder AsyncSnapshotにはConnectionStateというプロパティがあり、名前の通りコネクションがどのような状態かを知ることができる。これで、activeなのにhasDataがfalseの場合は、取得したがnullだったということなのでsign-outの状態ということがわかる。 code: main.dart
if (!snapshot.hasData) {
switch (snapshot.connectionState) {
case ConnectionState.active:
return Scaffold(
body: FlatButton(
color: Colors.grey,
onPressed: () => googleLogin(),
child: Text('login')),
);
case ConnectionState.waiting:
return Scaffold(
appBar: AppBar(title: Text(''), actions: <Widget>[]),
body: LinearProgressIndicator());
default:
LinearProgressIndicator();
}