Chi*_*ria 11 dart firebase-authentication flutter
我有一个WelcomeScreen
包含注册和登录以及HomeScreen
我想在用户登录后重定向的位置。为了管理身份验证数据,我创建了一个auth.dart
带有static
属性和方法的属性和方法,以便我可以使用相同的数据跨所有页面访问它们。
import 'package:firebase_auth/firebase_auth.dart';
class Auth {
static final auth = FirebaseAuth.instance;
static Future<void> logout() async {
await auth.signOut();
}
static Future<void> loginUser(String userEmail, String userPassword) async {
await auth.signInWithEmailAndPassword(email: userEmail, password: userPassword);
}
static Future<FirebaseUser> getCurrentUser() async {
return await auth.currentUser();
}
}
Run Code Online (Sandbox Code Playgroud)
在main.dart
文件中,我使用StreamBuilder
基于更改身份验证数据来更改当前屏幕。我StreamBuilder
从这个答案中得到了这个代码。
home: StreamBuilder<FirebaseUser>(
stream: Auth.auth.onAuthStateChanged,
builder: (context, snapshot) {
if (snapshot.hasData) {
return HomeScreen();
} else {
return WelcomeScreen();
}
},
),
Run Code Online (Sandbox Code Playgroud)
在我的登录屏幕中,我使用以下代码来触发登录:
Future<void> login() async {
...
try {
await Auth.loginUser(userEmail, userPassword);
var user = await Auth.getCurrentUser();
print(user.displayName); // This works
} catch (error) {
print(error.message);
}
}
Run Code Online (Sandbox Code Playgroud)
我不知道我使用的静态方法是否是处理 Firebase 身份验证的正确方法,但它似乎有效。在登录后,我能够显示登录的用户,但名称StreamBuilder
中main.dart
不反映更新的权威性数据,即不改变页面。
是因为静态方法还是在实现中出了StreamBuilder
什么问题?
Cop*_*oad 14
provider
)完整代码:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(
ChangeNotifierProvider<AuthModel>(
create: (_) => AuthModel(),
child: MaterialApp(
home: Consumer<AuthModel>(
builder: (_, auth, __) => auth.isSignedIn ? HomePage() : WelcomePage(),
),
),
),
);
}
class WelcomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('WelcomePage')),
body: Center(
child: ElevatedButton(
onPressed: () => Navigator.push(context, MaterialPageRoute(builder: (_) => LoginPage())),
child: Text('Go to Login Page'),
),
),
);
}
}
class LoginPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Login Page')),
body: Center(
child: ElevatedButton(
onPressed: () async {
final model = context.read<AuthModel>();
await model.signIn(email: 'test@test.com', password: 'test1234');
Navigator.pop(context);
},
child: Text('Login'),
),
),
);
}
}
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('HomePage')),
body: Center(
child: FloatingActionButton.extended(
onPressed: () async {
final model = context.read<AuthModel>();
await model.signOut();
},
label: Text('Log out'),
),
),
);
}
}
class AuthModel extends ChangeNotifier {
final FirebaseAuth _auth = FirebaseAuth.instance;
bool get isSignedIn => _auth.currentUser != null;
Future<void> signIn({required String email, required String password}) async {
await _auth.signInWithEmailAndPassword(email: email, password: password);
notifyListeners();
}
Future<void> signOut() async {
await _auth.signOut();
notifyListeners();
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4858 次 |
最近记录: |