0
votes

FutureBuilder fonctionne bien sur la scène de débogage mais sur APK Build lance toujours une erreur

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(),
      ),
    );
  }
}


4 commentaires

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.


3 Réponses :


0
votes

Tout d'abord, vous appelez 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>.

Alors ce code ne fait fondamentalement rien: p> xxx pré>

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> xxx pré>

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 HASDATA code> de l'instantané. Quelque chose comme ça pourrait fonctionner: p> xxx pré>

juste pour la clarté. L'erreur que vous voyez vient de ce bogue ici: P>

case ConnectionState.done:
   if (asyncSnapshot.hasData)
      return Text(asyncSnapshot.error.toString());


2 commentaires

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 ().



0
votes

La solution consistait à ajouter de

dans le fichier manifeste.xml lorsque le dernier SDK à flutter a changé la structure du projet.


0 commentaires

0
votes

Oui, la solution consistait à ajouter , mais vous devez l'ajouter dans le fichier androidmanifest.xml à l'emplacement / Android / SRC / Main dans votre projet de battement


0 commentaires