Ici, j'essaie d'ajouter une chargeuse en plein écran, mais cela ne fonctionne pas, j'ai déjà terminé le code mais quand j'essaie d'ajouter une chargeuse en plein écran, elle ne fonctionnera pas. Alors, ici, je veux simplement ajouter le chargeur de plein écran lorsque je clique sur le bouton de connexion. Dans ce code, j'ai déjà défini la variable _isloader lorsque son chargeur vrai sera affiché.
Voici le code que j'ai essayé. P>
class LoginScreen extends StatefulWidget { LoginScreen({Key key}) : super(key: key); @override _LoginScreenState createState() => _LoginScreenState(); } class _LoginScreenState extends State<LoginScreen> { @override Widget build(BuildContext context) { final formKey = new GlobalKey<FormState>(); final _emailFocusNode = new FocusNode(); final _passwordFocusNode = new FocusNode(); String _username; String _password; bool rememberMe = false; bool _isLoading = false; @override void initState() { super.initState(); } void _showErrorDialog(String message) { showDialog( barrierDismissible: false, context: context, builder: (context) => ShowErrorDialog( title: Text('An Error Occurred!'), content: Text(message), )); } Widget _buildUserNameField() { return EnsureVisibleWhenFocused( focusNode: _emailFocusNode, child: TudoEmailWidget( focusNode: _emailFocusNode, prefixIcon: Icon(Icons.email), labelText: AppConstantsValue.appConst['login']['email'] ['translation'], validator: (val) => Validators.validateEmail(val.trim()), onSaved: (val) => _username = val.trim(), // onChanged:(val) => _username = val.trim(), ), ); } Widget _buildPasswordField() { return EnsureVisibleWhenFocused( focusNode: _passwordFocusNode, child: TudoPasswordWidget( focusNode: _passwordFocusNode, prefixIcon: Icon(Icons.vpn_key), hintText: AppConstantsValue.appConst['login']['password'] ['translation'], labelText: AppConstantsValue.appConst['login']['password'] ['translation'], validator: Validators().validatePassword, onSaved: (val) => _password = val.trim(), ), ); } Widget _buildLoginButton(BuildContext context, LoginViewModel loginVm) { return GestureDetector( child: TudoLoginButtonWidget.buildRoundedRectButton( "Log In", signInGradients, false), onTap: () async { if (!formKey.currentState.validate()) { // Invalid! return; } formKey.currentState.save(); print("User"); setState(() { _isLoading = true; }); try { LoginRepository _loginRepository = LoginRepository(); Map<String, dynamic> loginResponse = await _loginRepository.loginUser(_username, _password); if (loginResponse['error'] != null) { var errorMessage = 'Invalid email or password'; _showErrorDialog(errorMessage); } else { LoginUser userModel = LoginUser( token: loginResponse['data']['loginUser']['token'], user: User.fromJson( loginResponse['data']['loginUser']['user'], ), ); SharedPreferences preferences = await SharedPreferences.getInstance(); preferences.setString('user', loginUserToJson(userModel)); loginVm.loginMe(context, userModel); } setState(() { _isLoading = false; }); } catch (error) { print('error'); print(error); setState(() { _isLoading = false; }); var errorMessage = 'Authentication failed'; _showErrorDialog(errorMessage); } }, ); } Widget content(context, loginVm) { ProgressDialog pr = new ProgressDialog(context, type: ProgressDialogType.Normal); pr.style(message: 'Showing some progress...'); return new SafeArea( top: false, bottom: false, child: Form( key: formKey, child: Scrollbar( child: SingleChildScrollView( dragStartBehavior: DragStartBehavior.down, padding: const EdgeInsets.symmetric(horizontal: 16.0), child: new Container( margin: EdgeInsets.fromLTRB(30, 100, 30, 0), child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: <Widget>[ TudoLogoWidget(), _buildUserNameField(), SizedBox( height: 20, ), _buildPasswordField(), SizedBox( height: 20.0, ), _buildLoginButton(context, loginVm), SizedBox( height: 20, ), ], ), ), ), ), ), ); } return new WillPopScope( onWillPop: () => SystemChannels.platform.invokeMethod('SystemNavigator.pop'), child: Scaffold( body: Container( height: double.infinity, width: double.infinity, child: Stack( children: <Widget>[ Background(), SingleChildScrollView( child: StoreConnector<AppState, LoginViewModel>( converter: (Store<AppState> store) => LoginViewModel.fromStore(store), builder: (BuildContext context, LoginViewModel loginVm) => content(context, loginVm), )), ], ), ), ), ); } } class LoginViewModel { final Function(BuildContext context, LoginUser loginUser) loginMe; LoginViewModel({ this.loginMe, }); static LoginViewModel fromStore(Store<AppState> store) { return LoginViewModel( loginMe: (context, loginUser) { store.dispatch( login(context, loginUser), ); }, ); } }
4 Réponses :
J'ai remarqué que vous avez beaucoup de choses imbriquées dans votre méthode de construction. Vous pouvez les tirer.
Je veux dire par exemple, je ne pense pas que votre méthode InitState () sera appelée à tout moment. P>
Ce que vous devez faire est:
Il suffit de retirer la ligne d'où il se trouve maintenant: p> et il ajoutez comme: p>
Pouvez-vous s'il vous plaît décrire ce petit peu plus?
Je crée une classe pour montrer / fermer la boîte de dialogue de chargement. de
Chaque fois que vous devez montrer une boîte de dialogue de chargement complet, vous devez simplement appeler cette méthode. Je pense que c'est un moyen très efficace de le faire car vous n'avez pas besoin d'écrire du code à chaque fois pour la boîte de dialogue P> class ProcessDialog {
static ProcessDialog _instance = new ProcessDialog.internal();
static bool _isLoading = false;
ProcessDialog.internal();
factory ProcessDialog() => _instance;
static BuildContext _context;
static void closeLoadingDialog() {
if (_isLoading) {
Navigator.of(_context).pop();
_isLoading = false;
}
}
static void showLoadingDialog(BuildContext context) async {
_context = context;
_isLoading = true;
await showDialog(
context: _context,
barrierDismissible: false,
builder: (BuildContext context) {
return SimpleDialog(
elevation: 0.0,
backgroundColor: Colors.transparent,
children: <Widget>[
Center(
child: CircularProgressIndicator(
valueColor:
AlwaysStoppedAnimation<Color>(ColorUtils.primaryColor),
),
)
],
);
});
}
}
void showWait(context) { showDialog( context: context, child: BackdropFilter( filter: ImageFilter.blur(sigmaX: 4.0, sigmaY: 4.0), child: Scaffold( backgroundColor: Colors.transparent, body: Container( color: Colors.transparent, width: MediaQuery.of(context).size.width, height: MediaQuery.of(context).size.height, child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Container( width: MediaQuery.of(context).size.width, child: CircularProgressIndicator() ), Container( margin: EdgeInsets.symmetric(vertical: 20), child: Text( "LOADING...", style: TextStyle(color: Colors.white), ), ) ], ), ), ))); } and Just call showWait(context); in your button event.
Vous pouvez ajouter facilement un chargeur en plein écran à l'aide de Paquet Easyloader
Un exemple de Comment l'utiliser: p> } p> p>
Pourriez-vous s'il vous plaît formater votre code correctement? Ce n'est pas un moyen que
@override code> et
initstate code> pourrait exister dans
Caille code> Fonction ...