【问题标题】:How to pass the function for Onpressed for buttons in another page in flutter?如何在颤动中为另一个页面中的按钮传递 Onpressed 的功能?
【发布时间】:2020-11-28 12:51:24
【问题描述】:

我已经为自定义按钮创建了一个文件作为小部件功能。但我需要在很多地方使用它。但是我需要将页面路由到当时我需要的地方。如何做到这一点?请帮忙!

【问题讨论】:

    标签: android flutter authentication google-signin


    【解决方案1】:

    创建一个名为 ROOTPAGE.dart 的文件并添加代码以检查是否存在现有用户登录。如果找到用户 ID,则转到主页,否则转到登录,

     import 'package:name/pages/homepage.dart';
    import 'package:name/pages/login_page.dart';
    import 'package:flutter/material.dart';
    import 'package:name/services/authentication.dart';
    
    enum AuthStatus {
      NOT_DETERMINED,
      NOT_LOGGED_IN,
      LOGGED_IN,
    }
    
    class RootPage extends StatefulWidget {
      RootPage({this.auth});
    
      final BaseAuth auth;
    
      @override
      State<StatefulWidget> createState() => new _RootPageState();
    }
    
    class _RootPageState extends State<RootPage> {
      AuthStatus authStatus = AuthStatus.NOT_DETERMINED;
      String _userId = "";
    
      @override
      void initState() {
        super.initState();
        widget.auth.getCurrentUser().then((user) {
          setState(() {
            if (user != null) {
              _userId = user?.uid;
             
            }
            authStatus =
                user?.uid == null ? AuthStatus.NOT_LOGGED_IN : AuthStatus.LOGGED_IN;
          });
        });
      }
    
      void loginCallback() {
        widget.auth.getCurrentUser().then((user) {
          setState(() {
            _userId = user.uid.toString();
             authStatus = AuthStatus.LOGGED_IN;
            Navigator.of(context).pushReplacementNamed('/');
                  });  });
      }
    
      void logoutCallback() {
        setState(() {
          authStatus = AuthStatus.NOT_LOGGED_IN;
          _userId = "";
        });
      }
    
    
      Widget buildWaitingScreen() {
        return Scaffold(
          body: Container(
            height: MediaQuery.of(context).size.height,
            width: MediaQuery.of(context).size.width,
           ......
          ),
        );
      }
    
      @override
      Widget build(BuildContext context) {
        switch (authStatus) {
          case AuthStatus.NOT_DETERMINED:
            return buildWaitingScreen();
            break;
          case AuthStatus.NOT_LOGGED_IN:
            return new LoginSignUpPage(
              auth: widget.auth,
              loginCallback: loginCallback,
              title: "name",
            );
            break;
          case AuthStatus.LOGGED_IN:
            if (_userId.length > 0 && _userId != null) {
              return new HomePage(
                userId: _userId,
                auth: widget.auth,
                logoutCallback: logoutCallback,
              );
            } else
              return buildWaitingScreen();
            break;
          default:
            return buildWaitingScreen();
        }
      }
    }
    

    将这个类传递给你的 main.dart

     home: new RootPage(auth: new Auth())
    

    我有一个具有登录功能的身份验证类。修改此代码以帮助您解决问题。这是getcurrent用户函数

    Future<FirebaseUser> getCurrentUser() async {
    FirebaseUser user = await _firebaseAuth.currentUser();
    return user;
    

    }

    【讨论】:

      【解决方案2】:

      您必须将此数据存储在用户设备中。 shared_preferences 包对此非常有帮助。

      用于存储数据:

      SharedPreferences perf = await SharedPreferences.getInstance();
      perf.setBool(label, value);
      

      读取数据:

      SharedPreferences perf = await SharedPreferences.getInstance();
      bool isUserSignedIn = perf.getBool(label);
      

      这里的label 是一个String,它是一个唯一的标识符

      有关shared_preferences 包的更多信息,请使用此链接 https://pub.dev/packages/shared_preferences/example

      【讨论】:

      • 在 java 中,有一个名为 private 的选项可以在私有模式下存储共享首选项,flutter 中有类似的东西吗?
      猜你喜欢
      • 2021-01-25
      • 1970-01-01
      • 1970-01-01
      • 2021-08-03
      • 1970-01-01
      • 1970-01-01
      • 2015-10-20
      • 2020-12-08
      • 1970-01-01
      相关资源
      最近更新 更多