firebase - 如何在有状态的小部件中使用键?

标签 firebase flutter dart firebase-authentication

我有两个文件,在一个文件中,我有auth类,用于处理身份验证。
错误处理也在auth类中,我要做的就是将错误传递到登录屏幕,
这是我的认证类(class)

Future<FirebaseUser> handleSignInEmail(String email, String password) async {
  

    FirebaseUser user;
    var errorMessage;

    try {
      AuthResult result = await _auth.signInWithEmailAndPassword(
          email: email, password: password);
      user = result.user;
    } catch (error) {
      switch (error.code) {
        case "ERROR_INVALID_EMAIL":
          errorMessage = "Your email address appears to be malformed.";

          break;
        case "ERROR_WRONG_PASSWORD":
          errorMessage = "Your password is wrong.";
          break;
        case "ERROR_USER_NOT_FOUND":
          errorMessage = "User with this email doesn't exist.";
          break;
        case "ERROR_USER_DISABLED":
          errorMessage = "User with this email has been disabled.";
          break;
        case "ERROR_TOO_MANY_REQUESTS":
          errorMessage = "Too many requests. Try again later.";
          break;
        case "ERROR_OPERATION_NOT_ALLOWED":
          errorMessage = "Signing in with Email and Password is not enabled.";
          break;
        default:
          errorMessage = "An undefined Error happened.";
      }
    }

    if (errorMessage != null) {
      Body(
        key: errorMessage,// the error occurs here :(
      );
      return Future.error(errorMessage);
    }

    return user;
  }
这是我的 body 课,我必须在其中传递错误。
class Body extends StatefulWidget {
  final errorMess;

  Body({Key key, this.errorMess}) : super(key: key);

  @override
  _BodyState createState() => _BodyState();
}
在我的 body 状态下,我具有此功能,
 geterrorMesage() {
    print(widget.errorMess);
  }
当我尝试调用此函数时,发生异常-
无法将参数类型'String'分配给参数类型'Key'。
如何解决这个问题?

最佳答案

您可以在下面复制粘贴运行完整代码
您可以将_key传递给Body并使用_key.currentState调用geterrorMesage程式码片段

GlobalKey _key = GlobalKey();

...
final _BodyState _bodyState = _key.currentState;
_bodyState.geterrorMesage("this is test");

...
Body(
          key: _key,
          errorMess: "no error",
        ),
...         
geterrorMesage(String errorMess) {
    print(errorMess);
    setState(() {
      _errorMess = errorMess;
    });
  }
工作演示
enter image description here
完整的代码
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  GlobalKey _key = GlobalKey();

  void _incrementCounter() {
    final _BodyState _bodyState = _key.currentState;
    _bodyState.geterrorMesage("this is test");

    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
            Body(
              key: _key,
              errorMess: "no error",
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

class Body extends StatefulWidget {
  final errorMess;
  Body({Key key, this.errorMess}) : super(key: key);

  @override
  _BodyState createState() => _BodyState();
}

class _BodyState extends State<Body> {
  String _errorMess = "";

  geterrorMesage(String errorMess) {
    print(errorMess);
    setState(() {
      _errorMess = errorMess;
    });
  }

  @override
  void initState() {
    super.initState();
    _errorMess = widget.errorMess;
  }

  @override
  Widget build(BuildContext context) {
    return Text("${_errorMess}");
  }
}

关于firebase - 如何在有状态的小部件中使用键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63166918/

相关文章:

Flutter - 同时请求多个 API 的最佳方式

java - 我真的应该删除 ValueEventListener 吗?

swift - 如何从 Firebase 存储每个键有多个值的数据?

flutter - 我试图在 flutter 中添加一个轮播 slider ,但我面临缺少所需的参数错误

dart - Flutter - 创建不同类型的列表 - 示例 (i) => i % 6 == 0 ?

android - Flutter重新运行内部StatefulWidget的initState函数

flutter - 如何在 Flutter/Dart 中使用带有基类的 Provider

android - 如何从 firestore 中获取子集合数据

javascript - 我可以从 img 标签将图像上传到 firebase 存储吗

firebase - 如何在 flutter 中从 firebase 获取数据