J'essaie d'utiliser des préférences partagées pour conserver la connexion à l'utilisateur et je l'ai mise dans l'écran Splash et lorsque j'exécute le projet, cette erreur est apparue:
[Erreur: Flutter / UI / UI / UI_DART_STATE.CC (157)]] Non gérée par exception: p>
SetState () appelé après le disposer (): _splashcreenstate # AA9C8 (cycle de vie p>
Etat: défunt) Cette erreur se produit si vous appelez SSTATE () sur un état P>
objet pour un widget qui n'apparaît plus dans l'arborescence du widget (E.g., P>
dont le widget parent n'inclut plus le widget dans sa construction). Ceci p>
erreur peut se produire lorsque des appels de code SETState () à partir d'une minuterie ou d'un P>
rappel d'animation. La solution préférée consiste à annuler la minuterie ou p>
Arrêtez d'écouter l'animation dans la section Dispose () Rappel. Un autre p>
solution consiste à vérifier la propriété "montée" de cet objet avant p>
appeler SSTATE () Pour vous assurer que l'objet est toujours dans l'arborescence. Ceci p>
Erreur peut indiquer une fuite de mémoire si le SSTATE () est appelé P>
Parce que un autre objet consiste à retenir une référence à cet objet d'état p>
Après avoir été retiré de l'arbre. Pour éviter les fuites de mémoire, p>
envisagez de casser la référence à cet objet lors du dispositif (). P> blockQquote>
et la boucle de données n'arrête pas d'm'appeler à nouveau et encore. P>
Ceci ma méthode à utiliser des préférences partagées: P>
@override Widget build(BuildContext context) { userProvider = Provider.of<UserProvider>(context, listen: false); appProvider = Provider.of<AppProvider>(context, listen: false); init(); return isLoading == true ? Container( color: Colors.white, child: Center( child: CircularProgressIndicator()), ) : Container( child: Scaffold( body: Stack( children: <Widget>[ Container( foregroundDecoration: !AppTheme.isLightTheme ? BoxDecoration( color: AppTheme.getTheme() .backgroundColor .withOpacity(0.4)) : null, width: MediaQuery.of(context).size.width, height: MediaQuery.of(context).size.height, child: Image.asset('assets/images/introduction.jpg', fit: BoxFit.cover), ), Column( children: <Widget>[ Expanded( flex: 1, child: SizedBox(), ), Center( child: Container( width: 60, height: 60, decoration: BoxDecoration( borderRadius: BorderRadius.all( Radius.circular(8.0), ), boxShadow: <BoxShadow>[ BoxShadow( color: AppTheme.getTheme().dividerColor, offset: Offset(1.1, 1.1), blurRadius: 10.0), ], ), child: ClipRRect( borderRadius: BorderRadius.all( Radius.circular(8.0), ), child: Image.asset('assets/images/appIcon.png'), ), ), ), SizedBox( height: 16, ), Text( "Voyager", textAlign: TextAlign.left, style: TextStyle( fontWeight: FontWeight.w600, fontSize: 24, ), ), SizedBox( height: 8, ), Text( "Best Trips deals for your holiday", textAlign: TextAlign.left, style: TextStyle( fontSize: 14, ), ), Expanded( flex: 4, child: SizedBox(), ), Padding( padding: const EdgeInsets.only( left: 48, right: 48, bottom: 8, top: 8), child: Container( height: 48, decoration: BoxDecoration( color: AppTheme.getTheme().primaryColor, borderRadius: BorderRadius.all(Radius.circular(24.0)), boxShadow: <BoxShadow>[ BoxShadow( color: AppTheme.getTheme().dividerColor, blurRadius: 8, offset: Offset(4, 4), ), ], ), child: Material( color: Colors.transparent, child: InkWell( borderRadius: BorderRadius.all(Radius.circular(24.0)), highlightColor: Colors.transparent, onTap: () { Navigator.push( context, MaterialPageRoute( builder: (context) => IntroductionScreen()), ); }, child: Center( child: Text( "Get started", style: TextStyle( fontWeight: FontWeight.w500, fontSize: 16, color: Colors.white), ), ), ), ), ), ), Padding( padding: EdgeInsets.only( bottom: 24.0 + MediaQuery.of(context).padding.bottom, top: 16), child: Container( child: Material( color: Colors.transparent, child: InkWell( borderRadius: BorderRadius.all(Radius.circular(24.0)), highlightColor: Colors.transparent, onTap: () { Navigator.push( context, MaterialPageRoute( builder: (context) => LoginScreen(context)), ); }, child: Text( "Already have account? LogIn", textAlign: TextAlign.left, style: TextStyle( fontSize: 14, color: Colors.white, ), ), ), ), ), ), ], ), ], ), ), ); }
3 Réponses :
pls, appelez votre fonction init en microtask.
Future.microtask(() => {init()});
J'ai eu que lorsque j'ai ajouté votre ligne, la classe "_splashsteState" n'a pas de constructeur par défaut. Essayez d'utiliser l'un des constructeurs nommés définis dans '_splashscreenstate'
Vous devriez utiliser un widget d'état. Vous pouvez essayer toute la logique ici. @override vide initstate () {super.inittstate (); // TODO: futur.microtask (// logique)}
@mariam Veuillez utiliser monté monté,
if (this.mounted){ setState((){ //Your state change code goes here }); }
où devrais-je le mettre s'il vous plaît ans comment, désolé mais je ne l'ai pas traité avant
use mounted before setState if (isLog) { String email = prefs.getString("email"); String pass = prefs.getString("pass"); if(mounted) setState(() { signIn(email, pass); }); } else { if(mounted) setState(() { isLoading = false; }); }
Pouvez-vous mettre votre code complet? Je pense que cela vient dans votre écran Splash.