首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Provider进行颤动状态管理

使用Provider进行颤动状态管理
EN

Stack Overflow用户
提问于 2019-05-20 17:35:31
回答 1查看 2.2K关注 0票数 5

我有一个简单的Provider类:

代码语言:javascript
复制
import 'package:flutter/foundation.dart';

class AppState with ChangeNotifier {
  bool _isLoggedIn = false;
  bool get isLoggedIn => _isLoggedIn;

  set isLoggedIn(bool newValue) {
    _isLoggedIn = newValue;
    notifyListeners();
  }
}

在登录类中,如果登录成功,我会将isLoggedIn设置为true:

代码语言:javascript
复制
 void _signInWithEmailAndPassword(appState) async {
    try {
      final FirebaseUser user = await _auth.signInWithEmailAndPassword(
        ...
      );

      if (user != null) {
        appState.isLoggedIn = true;
        appState.userData = user.providerData;
        ...
      }
    } catch (e) {
      setState(() {
        _errorMessage = e.message;
      });
    }
  }

按下Android上的后退按钮,用户即使在成功登录后也可以返回到此页面。所以我想知道在Widget build之前是否可以访问Provider.of,如果isLoggedIntrue,是否可以重定向用户。

现在我有了一些类似的东西:

代码语言:javascript
复制
@override
  Widget build(BuildContext context) {
    final appState = Provider.of<AppState>(context);
...

这只是登录视图的一个用例,但我确信此功能可以在其他情况下使用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-20 17:59:05

如果您要在整个应用程序中使用FirebaseUser或登录用户,我建议您在应用程序的最高级别添加提供商。示例

代码语言:javascript
复制
void main() {

   runApp(MyApp());
   }

class MyApp extends StatelessWidget {
  MyApp();

  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        StreamProvider<FirebaseUser>.value(
          stream: FirebaseAuth.instance.onAuthStateChanged, // Provider here
        ),
      ],
      child: MaterialApp(
        title: 'My App',
        debugShowCheckedModeBanner: false,
        theme: ThemeData(
          primaryColor: Colors.green,
          primarySwatch: Colors.green,
          accentColor: Colors.yellow,
        ),
        home: MainPage(),
      ),
    );
  }
}

class MainPage extends StatefulWidget {
  MainPage({Key key, this.storage}) : super(key: key);
  final FirebaseStorage storage;
  @override
  _MainPageState createState() => _MainPageState();
}

class _MainPageState extends State<MainPage>
    with SingleTickerProviderStateMixin {
  @override
  Widget build(BuildContext context) {
    final user = Provider.of<FirebaseUser>(context); // gets the firebase user
    bool loggedIn = user != null;

    return loggedIn ? HomePage() : LoginPage(); // Will check if the user is logged in. And will change anywhere in the app if the user logs in
  }
}

参考文献

Fireship 185 Provider

Great Youtube video explaining the code

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56218108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档