J'ai le code suivant qui doit indiquer un indicateur de processus pendant le processus d'exploitation de données JSON à partir du Web. Cela fonctionne bien lorsque je cours dans le mode de débogage. Mais dès que je le fais à APK, l'application s'ouvre et sans délai, elle jette cette erreur:
socketException: p> BlockQuote>
Comment se débarrasser de ces problèmes? P>
import 'package:flutter/material.dart'; import 'dart:async'; import 'package:http/http.dart' as http; import 'dart:convert' as convert; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: MyHomePage(title: 'Quize It Up'), ); } } class MyHomePage extends StatefulWidget { MyHomePage({Key key, this.title}) : super(key: key); final String title; @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { @override void initState() { super.initState(); getCategories(); } Future<List> getCategories() async { var url = 'https://opentdb.com/api_category.php'; var response = await http .get(Uri.encodeFull(url), headers: {"Accept": "application/json"}); var jsonResponse = convert.jsonDecode(response.body); List categories = jsonResponse["trivia_categories"]; return categories; } Widget mainGui() { return Container( child: FutureBuilder( future: getCategories(), builder: (BuildContext context, AsyncSnapshot<List> asyncSnapshot) { switch (asyncSnapshot.connectionState) { case ConnectionState.active: case ConnectionState.waiting: return Center( child: CircularProgressIndicator(), ); case ConnectionState.none: return RaisedButton( onPressed: () => getCategories(), ); case ConnectionState.done: if (asyncSnapshot.hasData) return Text(asyncSnapshot.error.toString()); else return ListView.builder( itemCount: asyncSnapshot.data.length, itemBuilder: (context, int index) { return ListTile( title: Text(asyncSnapshot.data[index]['name']), ); }, ); } })); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: Container( child: mainGui(), ), ); } }
3 Réponses :
Tout d'abord, vous appelez Alors ce code ne fait fondamentalement rien: p> afin d'afficher un bouton qui recharge l'avenir, vous pouvez plutôt rafraîchir l'état comme celui-ci. Cela va reconstruire votre widget et donc reconstruire l'avenir. p> mais de toute façon. Si tout ce que vous souhaitez réaliser est un indicateur de chargement tandis que l'avenir est chargé, je préfère observer l'attribut juste pour la clarté. L'erreur que vous voyez vient de ce bogue ici: P> getcatégories (); code> dans votre initstate () code> méthode sans raison. Étant donné que getCatégories () code> construit simplement et retourne un avenir que vous n'utilisez pas dans InitiState Cet appel n'est pas pertinent. Vous pouvez simplement supprimer cette ligne ou même l'intégralité de l'ensemble de la méthode code> initstate () code>. HASDATA code> de l'instantané. Quelque chose comme ça pourrait fonctionner: p> case ConnectionState.done:
if (asyncSnapshot.hasData)
return Text(asyncSnapshot.error.toString());
La chose est que ce code et mon code ci-dessus fonctionnent en mode de débogage, mais pas lorsque vous construisez l'APK et l'exécutez. Dans votre code, le spinner se déplace pour toujours .Nouveau quelle est la solution
Avez-vous essayé mes suggestions? Suppression sur particulièrement la méthode initstate ().
La solution consistait à ajouter de dans le fichier manifeste.xml lorsque le dernier SDK à flutter a changé la structure du projet. P>
Oui, la solution consistait à ajouter
Quelle est l'erreur?
SocketException: ce qui est invoqué uniquement lorsque je construisai l'APK et exécuté dans l'appareil.
Pouvez-vous poster les traces de pile pour cela?
C'est une erreur d'exécution lorsque je construis l'APK et l'exécuter séparément.