flutter - 如何在 Flutter 应用程序的 initState 期间使用来自 Provider 的数据

标签 flutter flutter-layout state-management flutter-provider flutter-state

我通过添加 Provider 作为状态管理来重构我的 Flutter 应用程序代码。

期望的行为:当主屏幕打开时,应用程序应检查用户的电子邮件是否已验证,如果未验证,则应显示对话框弹出窗口。

问题:当我通过构造函数为 EmailVerified 传递数据时,它工作正常,但如果我想使用 Provider,我无法在 initState() 获取此数据。生命周期。

您能否为我推荐这种用例的正确方法?

import 'package:myapp/services/authentication.dart';
import 'package:myapp/screens/settings_screen.dart';
import 'package:flutter/material.dart';
import 'package:myapp/services/authentication.dart';
import 'package:provider/provider.dart';

class HomeScreen extends StatefulWidget {

  @override
  State<StatefulWidget> createState() => new _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  final GlobalKey<FormState> formKey = GlobalKey<FormState>();
  bool _isEmailVerified = false;

  @override
  void initState() {
    super.initState();
    _checkEmailVerification(); // <=== Method which should show Dialog box if email is not verified which is coming from "Auth" Provider
  }

  @override
  Widget build(BuildContext context) {
    final auth = Provider.of<Auth>(context, listen: false); // <==== Service from Provider, which contains data for _isEmailVerified
    auth.isEmailVerified().then((value) => _isEmailVerified = value);

    return new Scaffold(
      appBar: new AppBar(
        title: new Text('My App'),
      ),
      body: Center(
        child: Column(
          children: <Widget>[
            Text(
              'Welcome to my app',
            ),
          ],
        ),
      ),
    );
  }

  void _checkEmailVerification() async {
    _isEmailVerified = auth.isEmailVerified(); // <=== How can I use "auth" from Provider to get isEmailVerified data ????
    if (!_isEmailVerified) {
      _showVerifyEmailDialog();
    }
  }

  void _showVerifyEmailDialog() {
    showDialog(
      context: context,
      builder: (BuildContext context) {
        // return object of type Dialog
        return AlertDialog(
          title: new Text("Verify your account"),
          content: new Text("Please verify account in the link sent to email"),
          actions: <Widget>[
            new FlatButton(
              child: new Text("Resend link"),
              onPressed: () {
                Navigator.of(context).pop();
                _resentVerifyEmail();
              },
            ),
            new FlatButton(
              child: new Text("Dismiss"),
              onPressed: () {
                Navigator.of(context).pop();
              },
            ),
          ],
        );
      },
    );
  }

  void _resentVerifyEmail() {
    // Logic to send email
  }
}

最佳答案

您需要使用上下文来调用 Provider.of()所以你可以添加 addPostFrameCallback()在第一次构建之后调用,在那里你可以使用上下文

@override
void initState() {
    super.initState();

    WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
      auth = Provider.of<Auth>(context, listen: false);
    });
}

关于flutter - 如何在 Flutter 应用程序的 initState 期间使用来自 Provider 的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60343605/

相关文章:

flutter - 什么是Dart和Flutter开发

flutter - 如何在列内添加包装 future builder

flutter - 我怎样才能用 Flutter markdown 证明文本的合理性?

flutter - 通过runApp()的Flutter状态和屏幕管理

reactjs - useContext 给我的 react 路由器 dom 带来了问题

flutter - 如何在Dart/Flutter中声明一个接受多个参数的函数回调?

android - Flutter - Android 在 Release模式下不请求许可 - 自动拒绝

firebase - Flutter - 后台通知在 iOS 中不起作用

android - 如何在MyApp()中调用包含的另一个文件或main.dart文件中的include函数

javascript - 为什么我们需要 mutations、setters 和 getters 来进行状态管理?