保持 Flutter dart 流打开以观察模型的变化
Keeping Flutter dart stream open to watch for changes to a model
我是 Flutter/Dart 的新手,正在尝试创建基本的身份验证服务。我的意思是让我的主应用程序监听一个流,该流将在发生身份验证操作时发出用户。这就是很多 Firebase 示例的工作方式,唯一的区别是我想直接连接到我自己的 API.
为此,我创建了一个 AuthService,但似乎无法正常工作。
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Provider<AuthService>(
create: (_) => AuthService(),
child: MaterialApp(
home: AuthWidget()
)
);
}
}
class AuthWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
final authService = Provider.of<AuthService>(context);
authService.getUser();
// wrap the application in a Stream that watches for the authentication state
// to change. On authentication state change,
return StreamBuilder<User>(
stream: authService.onAuthStateChanged,
builder: (context, snapshot) {
// check to ensure that the connectionState is active
if (snapshot.connectionState == ConnectionState.active) {
final user = snapshot.data;
return user == null ? Login() : Home();
}
return Login();
}
);
}
}
class AuthService {
User currentUser;
Future<User> getUser() {
return Future.value(currentUser);
}
void login(User user) {
currentUser = user;
}
void logout() {
currentUser = null;
}
Stream<User> get onAuthStateChanged {
return Stream.fromFuture(getUser());
}
}
我想达到的目标
在顶层 MyApp
,我希望能够使用 AuthProvider 监听身份验证的变化。我应该能够在任何地方访问身份验证提供程序,例如
final auth = Provider.of<AuthService>(context, listen: false);
// log the user in
auth.login(user);
// log the user out
auth.logout(user);
// get the current authenticated user
auth.getUser();
并用它来管理应用程序。我现有代码的问题是 Stream 状态会立即标记为完成,因此 onAuthStateChanged
不会发出进一步的更改。我实际上需要我的 AuthWidget
在应用程序的整个生命周期中继续监听,以便我可以响应 login/logout 事件并相应地更改 UI。
非常感谢任何帮助!
好的,我最终使用稍微不同的技术想出了一个解决方案。感谢 Aaron K Saunders 的这篇文章的指点 - https://dev.to/aaronksaunders/simple-login-flow-in-flutter-then-firebase-part-one-29n6
基本上我的 AuthService
现在实现了 ChangeNotifier,我可以在应用程序周围使用它来检查身份验证、显示不同的路由、获取当前用户等。
我是 Flutter/Dart 的新手,正在尝试创建基本的身份验证服务。我的意思是让我的主应用程序监听一个流,该流将在发生身份验证操作时发出用户。这就是很多 Firebase 示例的工作方式,唯一的区别是我想直接连接到我自己的 API.
为此,我创建了一个 AuthService,但似乎无法正常工作。
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Provider<AuthService>(
create: (_) => AuthService(),
child: MaterialApp(
home: AuthWidget()
)
);
}
}
class AuthWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
final authService = Provider.of<AuthService>(context);
authService.getUser();
// wrap the application in a Stream that watches for the authentication state
// to change. On authentication state change,
return StreamBuilder<User>(
stream: authService.onAuthStateChanged,
builder: (context, snapshot) {
// check to ensure that the connectionState is active
if (snapshot.connectionState == ConnectionState.active) {
final user = snapshot.data;
return user == null ? Login() : Home();
}
return Login();
}
);
}
}
class AuthService {
User currentUser;
Future<User> getUser() {
return Future.value(currentUser);
}
void login(User user) {
currentUser = user;
}
void logout() {
currentUser = null;
}
Stream<User> get onAuthStateChanged {
return Stream.fromFuture(getUser());
}
}
我想达到的目标
在顶层 MyApp
,我希望能够使用 AuthProvider 监听身份验证的变化。我应该能够在任何地方访问身份验证提供程序,例如
final auth = Provider.of<AuthService>(context, listen: false);
// log the user in
auth.login(user);
// log the user out
auth.logout(user);
// get the current authenticated user
auth.getUser();
并用它来管理应用程序。我现有代码的问题是 Stream 状态会立即标记为完成,因此 onAuthStateChanged
不会发出进一步的更改。我实际上需要我的 AuthWidget
在应用程序的整个生命周期中继续监听,以便我可以响应 login/logout 事件并相应地更改 UI。
非常感谢任何帮助!
好的,我最终使用稍微不同的技术想出了一个解决方案。感谢 Aaron K Saunders 的这篇文章的指点 - https://dev.to/aaronksaunders/simple-login-flow-in-flutter-then-firebase-part-one-29n6
基本上我的 AuthService
现在实现了 ChangeNotifier,我可以在应用程序周围使用它来检查身份验证、显示不同的路由、获取当前用户等。