ホーム>source

状態管理としてプロバイダーを追加して、Flutterアプリケーションコードをリファクタリングしています。

望ましい動作: ホーム画面が開いたら、アプリはユーザーがメールで確認済みかどうかを確認し、確認されていない場合はダイアログポップアップを表示する必要があります。

問題: コンストラクターを介してEmailVerifiedのデータを渡していたときはうまくいきましたが、プロバイダーを使用したい場合、 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 } }
あなたの答え
  • 解決した方法 # 1

    最初のビルド後に呼び出されるaddPostFrameCallback()を追加できるように、Provider.of()を呼び出すにはコンテキストを使用する必要があります。そこでは、コンテキストを使用できます。

    <前>ウィズウィズ @override void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((timeStamp) { auth = Provider.of<Auth>(context, listen: false); }); }

関連記事

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ javascript - phantomjs:私のpageevaluate(function())がパラメーターをとっていないので、値として渡し、nullエラーを出します