0
votes

Comment implémenter une analyse de données réseau puis une case à la case dans l'alerte à l'intérieur de Showdialog avec SetState

Je n'ai pas trouvé de moyen d'aller chercher des données de l'API de réseau à l'intérieur de Showdialog> Statefulbuilder> AlertDialog. Après avoir récupéré, ces données doivent afficher dans des cases à cocher, puis cliquez sur OK, les données de coche sélectionnées sont renvoyées sur le widget parent. Il y a plus d'états autres que ces états à cocher états dans l'alerte. Mais le navigator.of (contexte) .pop () code> peut ne pas renverser une seule valeur.

Y a-t-il un moyen de reconstruire l'Étatfulbuilder avec le STSTATER sur le widget parent. Ou un piratage facile pour reconstruire l'état-shirt à partir d'une fonction externe comme fetchorderstatus () code> dans le code ci-dessous. (Peut être possible avec une clé sur Statefulbuilder, mais ne sais pas comment). P>

ci-dessous est mon code P>

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart';
import 'package:http/http.dart' as http;
import 'package:intl/intl.dart';
import 'dart:convert';
import 'package:recase/recase.dart';
import 'package:woocommerceadmin/src/orders/widgets/OrderDetailsPage.dart';
import 'package:barcode_scan/barcode_scan.dart';

class OrdersListPage extends StatefulWidget {
  final String baseurl;
  final String username;
  final String password;

  OrdersListPage({
    Key key,
    @required this.baseurl,
    @required this.username,
    @required this.password,
  }) : super(key: key);

  @override
  _OrdersListPageState createState() => _OrdersListPageState();
}

class _OrdersListPageState extends State<OrdersListPage> {
  String baseurl;
  String username;
  String password;
  List ordersListData = List();
  int page = 1;
  bool hasMoreToLoad = true;
  bool isListLoading = false;

  bool isSearching = false;
  String searchValue = "";

  String sortOrderByValue = "date";
  String sortOrderValue = "desc";

  bool isOrderStatusOptionsReady = false;
  bool isOrderStatusOptionsError = false;
  String orderStatusOptionsError;
  Map<String, bool> orderStatusOptions = {};

  final scaffoldKey = new GlobalKey<ScaffoldState>();
  final GlobalKey<RefreshIndicatorState> _refreshIndicatorKey =
      new GlobalKey<RefreshIndicatorState>();

  @override
  void initState() {
    super.initState();
    baseurl = widget.baseurl;
    username = widget.username;
    password = widget.password;
    fetchOrdersList();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: scaffoldKey,
      appBar: _myAppBar(),
      body: RefreshIndicator(
        key: _refreshIndicatorKey,
        onRefresh: handleRefresh,
        child: Column(
          children: <Widget>[
            Expanded(
              child: NotificationListener<ScrollNotification>(
                onNotification: (ScrollNotification scrollInfo) {
                  if (hasMoreToLoad &&
                      !isListLoading &&
                      scrollInfo.metrics.pixels ==
                          scrollInfo.metrics.maxScrollExtent) {
                    handleLoadMore();
                  }
                },
                child: ListView.builder(
                    itemCount: ordersListData.length,
                    itemBuilder: (BuildContext context, int index) {
                      return Card(
                        child: InkWell(
                          onTap: () {
                            Navigator.push(
                              context,
                              MaterialPageRoute(
                                builder: (context) => OrderDetailsPage(
                                  id: ordersListData[index]["id"],
                                ),
                              ),
                            );
                          },
                          child: Row(
                              mainAxisAlignment: MainAxisAlignment.start,
                              mainAxisSize: MainAxisSize.max,
                              crossAxisAlignment: CrossAxisAlignment.center,
                              children: <Widget>[
                                Expanded(
                                  child: Padding(
                                    padding: const EdgeInsets.all(10.0),
                                    child: Column(
                                        mainAxisAlignment:
                                            MainAxisAlignment.start,
                                        mainAxisSize: MainAxisSize.min,
                                        crossAxisAlignment:
                                            CrossAxisAlignment.start,
                                        children: <Widget>[
                                          _orderDate(ordersListData[index]),
                                          _orderIdAndBillingName(
                                              ordersListData[index]),
                                          _orderStatus(ordersListData[index]),
                                          _orderTotal(ordersListData[index])
                                        ]),
                                  ),
                                )
                              ]),
                        ),
                      );
                    }),
              ),
            ),
            if (isListLoading)
              Container(
                height: 60.0,
                color: Colors.white,
                child: Center(
                    child: SpinKitFadingCube(
                  color: Colors.purple,
                  size: 30.0,
                )),
              ),
          ],
        ),
      ),
    );
  }

  Future<void> fetchOrderStatus() async {
    String url =
        "$baseurl/wp-json/wc/v3/reports/orders/totals?consumer_key=$username&consumer_secret=$password";
    setState(() {
      isOrderStatusOptionsReady = false;
      isOrderStatusOptionsError = false;
    });
    dynamic response;
    try {
      response = await http.get(url);
      if (response.statusCode == 200) {
        if (json.decode(response.body) is List &&
            !json.decode(response.body).isEmpty) {
          json.decode(response.body).forEach((item) {
            if (item is Map) {
              orderStatusOptions.putIfAbsent(item["slug"], () => false);
            }
          });
          setState(() {
            isOrderStatusOptionsReady = true;
          });
        } else {
          setState(() {
            isOrderStatusOptionsReady = false;
            isOrderStatusOptionsError = true;
            orderStatusOptionsError = "Failed to fetch order status options";
          });
        }
      } else {
        String errorCode = "";
        if (json.decode(response.body) is Map &&
            json.decode(response.body).containsKey("code") &&
            json.decode(response.body)["code"] is String) {
          errorCode = json.decode(response.body)["code"];
        }
        setState(() {
          isOrderStatusOptionsReady = false;
          isOrderStatusOptionsError = true;
          orderStatusOptionsError =
              "Failed to fetch order status options. Error: $errorCode";
        });
      }
    } catch (e) {
      setState(() {
        isOrderStatusOptionsReady = false;
        isOrderStatusOptionsError = true;
        orderStatusOptionsError =
            "Failed to fetch order status options. Error: $e";
      });
    }
  }

  Widget _myAppBar() {
    Widget myAppBar;

      myAppBar = AppBar(
        title: Text("Orders List"),
        actions: <Widget>[
          GestureDetector(
            child: Padding(
              padding: const EdgeInsets.only(left: 10),
              child: Icon(Icons.search),
            ),
            onTap: () {
              setState(() {
                isSearching = !isSearching;
              });
            },
          ),
          GestureDetector(
            child: Padding(
              padding: const EdgeInsets.symmetric(horizontal: 10),
              child: Icon(Icons.filter_list),
            ),
            onTap: _orderFilter,
          ),
        ],
      );
    }
    return myAppBar;
  }

  void _orderFilter() async {
    showDialog(
        context: context,
        barrierDismissible: false,
        builder: (BuildContext context){
          // fetchOrderStatus();  
          return StatefulBuilder(builder: (context, StateSetter setState) {
            return AlertDialog(
              title: Text("Sort & Filter"),
              titlePadding: EdgeInsets.fromLTRB(15, 20, 15, 0),
              content: Container(
                width: 300,
                height: 400,
                child: SingleChildScrollView(
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.start,
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: <Widget>[
                      Text(
                        "Sort by",
                        style: Theme.of(context).textTheme.subhead,
                      ),
                      Row(
                        children: <Widget>[
                          Expanded(
                            child: Container(
                              child: DropdownButton<String>(
                                underline: SizedBox.shrink(),
                                value: sortOrderByValue,
                                onChanged: (String newValue) {
                                  FocusScope.of(context)
                                      .requestFocus(FocusNode());
                                  setState(() {
                                    sortOrderByValue = newValue;
                                  });
                                },
                                items: <String>[
                                  "date",
                                  "id",
                                  "title",
                                  "slug",
                                  "include"
                                ].map<DropdownMenuItem<String>>((String value) {
                                  return DropdownMenuItem<String>(
                                    value: value,
                                    child: Text(
                                      value.titleCase,
                                      textAlign: TextAlign.center,
                                      style: Theme.of(context).textTheme.body1,
                                    ),
                                  );
                                }).toList(),
                              ),
                            ),
                          ),
                          InkWell(
                            child: Padding(
                              padding:
                                  const EdgeInsets.symmetric(horizontal: 10),
                              child: Icon(
                                Icons.arrow_downward,
                                color: (sortOrderValue == "desc")
                                    ? Theme.of(context).primaryColor
                                    : Colors.black,
                              ),
                            ),
                            onTap: () {
                              setState(() {
                                sortOrderValue = "desc";
                              });
                            },
                          ),
                          InkWell(
                            child: Padding(
                              padding:
                                  const EdgeInsets.symmetric(horizontal: 10),
                              child: Icon(
                                Icons.arrow_upward,
                                color: (sortOrderValue == "asc")
                                    ? Theme.of(context).primaryColor
                                    : Colors.black,
                              ),
                            ),
                            onTap: () {
                              setState(() {
                                sortOrderValue = "asc";
                              });
                            },
                          ),
                        ],
                      ),
                      Text(
                        "Filter by",
                        style: Theme.of(context).textTheme.subhead,
                      ),
                      Text(
                        "Order Status",
                        style: Theme.of(context).textTheme.body1.copyWith(
                            fontWeight: FontWeight.bold, fontSize: 16),
                      ),
                      isOrderStatusOptionsReady
                          ? ListView(
                              children:
                                  orderStatusOptions.keys.map((String key) {
                                return new CheckboxListTile(
                                  title: Text(key),
                                  value: orderStatusOptions[key],
                                  onChanged: (bool value) {
                                    setState(() {
                                      orderStatusOptions[key] = value;
                                    });
                                  },
                                );
                              }).toList(),
                            )
                          : Container(
                              child: Center(
                                child: SpinKitFadingCube(
                                  color: Theme.of(context).primaryColor,
                                  size: 30.0,
                                ),
                              ),
                            )
                    ],
                  ),
                ),
              ),
              contentPadding: EdgeInsets.fromLTRB(15, 10, 15, 0),
              actions: <Widget>[
                FlatButton(
                  child: Text("Close"),
                  onPressed: () {
                    Navigator.of(context).pop();
                  },
                ),
                FlatButton(
                  child: Text("Ok"),
                  onPressed: () {
                    Navigator.of(context).pop();
                  },
                )
              ],
            );
          });
        });
  }
}


0 commentaires

3 Réponses :


1
votes

Vous avez quelques options

  1. récupérez les données avant d'afficher la boîte de dialogue. Utilisation des mots-clés Async / attendez des mots-clés ou .Chen , vous attendez que la récupération de données complète, utilisez ensuite les données de la boîte de dialogue xxx
    1. Créez un nouveau widget Stateful pour la boîte de dialogue et avez Fetchorderstatus () Soyez une méthode dans cette classe. Cela vous permet d'avoir plus de contrôle sur ce qu'il faut afficher ainsi que des modifications de l'état dans la boîte de dialogue.

7 commentaires

Je ne peux pas utiliser la 1ère approche car j'ai besoin d'afficher la boîte de dialogue après la touche Icône. La 2e approche est plutôt utile mais ne peut pas comprendre comment passer des données sélectionnées à un autre widget.


@Gauravjain tu peux. Il suffit d'insérer ce feutre de code dans la fonction qui déclenche une fois le bouton appuyer sur le bouton. Si vous incluez votre bouton Appuyez sur le code dans votre question, je peux modifier ma réponse pour suivre ce format


@Gauravjain a modifié l'extrait de code. Il utilise maintenant async / attendre depuis que vous l'utilisez dans votre code.


Je comprends que je pourrais afficher l'alerte lorsque les données sont prêtes. Mais en fait je veux le contraire de ça. L'idée est que lorsque je clique sur le bouton, la boîte de dialogue s'ouvre, appelez Fetchorderstatus asynchrone, puis indique la valeur lorsque les données sont prêtes. Il y aura le chargement indiqué en alerte jusqu'à ce que les données soient prêtes. Le problème est que l'ensemble de la classe ne peut affecter la boîte de dialogue.


@Gauravjain Dans ce cas, vous devriez aller pour la deuxième option. Ce que vous voulez faire nécessite que la boîte de dialogue ait son propre état.


N'y a-t-il aucun moyen de déclencher une reconstruction de Statefulbuilder à partir de la fonction de Fetchorderstatus () après que j'appelle SetState () à l'aide de la clé Statefulturer. Toutes les autres choses fonctionnent bien.


@Gauravjain Malheureusement Non, pas que je sache. Vous ne pouvez pas dynamiquement "reconstruire" quelque chose qui n'a pas son propre état. En outre, en déplaçant le code de dialogue vers une autre classe, votre code actuel deviendrait beaucoup plus court et plus propre.



1
votes

@ Gaurav-Jain J'ai suivi votre question de GITUB où vous avez posé une question sur ma réponse à ce problème. Comment je l'ai fait est que j'ai un bouton qui, lorsque vous avez cliqué immédiatement ouvre la boîte de dialogue qui attend que l'avenir de charger les données de l'API: la fonction async fonction _showoptions () rendu La boîte de dialogue qui rend une liste de cases à cocher avec des options extraites à partir de API: xxx

l'état Voici l'état du widget parent, mais la boîte de dialogue ASYNC a son propre état de fais-le fonctionner. Vous pouvez vous reporter au commentaire GitHub pour les autres pièces du code ici ici HTTPS: //github.com/flutter/flutter/issues/15194#issuecomment-450490409


0 commentaires

0
votes

Comme suggéré par @wxker, 2e approche, j'ai mis en place un autre widget étatique qui renvoie alertdialog.

widget parent appelant showdialog sur le robinet: p> xxx pré>

widget d'enfant Alerte de retour avec la valeur par défaut et le rappel de fonction dans le constructeur pour modifier l'état du widget parent. P>

 Widget build(BuildContext context) {
    return AlertDialog(
      title: Text("Sort & Filter"),
      titlePadding: EdgeInsets.fromLTRB(15, 20, 15, 0),
      content: Container(
        height: 400,
        child: SingleChildScrollView(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.start,
            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
              Text(
                "Sort by",
                style: Theme.of(context).textTheme.subhead,
              ),
              Padding(
                padding: const EdgeInsets.fromLTRB(10, 0, 10, 0),
                child: Row(
                  children: <Widget>[
                    Expanded(
                      child: Container(
                        child: DropdownButton<String>(
                          underline: SizedBox.shrink(),
                          value: sortOrderByValue,
                          onChanged: (String newValue) {
                            FocusScope.of(context).requestFocus(FocusNode());
                            setState(() {
                              sortOrderByValue = newValue;
                            });
                          },
                          items: <String>[
                            "date",
                            "id",
                            "title",
                            "slug",
                            "include"
                          ].map<DropdownMenuItem<String>>((String value) {
                            return DropdownMenuItem<String>(
                              value: value,
                              child: Text(
                                value.titleCase,
                                textAlign: TextAlign.center,
                                style: Theme.of(context).textTheme.body1,
                              ),
                            );
                          }).toList(),
                        ),
                      ),
                    ),
                    InkWell(
                      child: Padding(
                        padding: const EdgeInsets.symmetric(horizontal: 10),
                        child: Icon(
                          Icons.arrow_downward,
                          color: (sortOrderValue == "desc")
                              ? Theme.of(context).primaryColor
                              : Colors.black,
                        ),
                      ),
                      onTap: () {
                        setState(() {
                          sortOrderValue = "desc";
                        });
                      },
                    ),
                    InkWell(
                      child: Padding(
                        padding: const EdgeInsets.symmetric(horizontal: 10),
                        child: Icon(
                          Icons.arrow_upward,
                          color: (sortOrderValue == "asc")
                              ? Theme.of(context).primaryColor
                              : Colors.black,
                        ),
                      ),
                      onTap: () {
                        setState(() {
                          sortOrderValue = "asc";
                        });
                      },
                    ),
                  ],
                ),
              ),
              Text(
                "Filter by",
                style: Theme.of(context).textTheme.subhead,
              ),
              SizedBox(
                height: 10,
              ),
              Padding(
                padding: const EdgeInsets.only(left: 10),
                child: Text(
                  "Order Status",
                  style: Theme.of(context)
                      .textTheme
                      .body1
                      .copyWith(fontWeight: FontWeight.bold, fontSize: 16),
                ),
              ),
              SizedBox(
                height: 10,
              ),
              isOrderStatusOptionsError
                  ? Row(
                      children: <Widget>[
                        Expanded(
                          child: Padding(
                            padding: const EdgeInsets.fromLTRB(10, 10, 10, 10),
                            child: Text(
                              orderStatusOptionsError,
                              style: Theme.of(context).textTheme.body1,
                            ),
                          ),
                        ),
                      ],
                    )
                  : isOrderStatusOptionsReady
                      ? Column(
                          children: orderStatusOptions.keys.map((String key) {
                            return GestureDetector(
                              onTap: () {
                                setState(() {
                                  orderStatusOptions[key] =
                                      !orderStatusOptions[key];
                                });
                              },
                              child: Container(
                                color: Colors.transparent,
                                height: 30,
                                child: Row(
                                  children: <Widget>[
                                    Checkbox(
                                      value: orderStatusOptions[key],
                                      onChanged: (bool value) {
                                        setState(() {
                                          orderStatusOptions[key] = value;
                                        });
                                      },
                                    ),
                                    Expanded(
                                      child: Text(
                                        key.titleCase,
                                        style:
                                            Theme.of(context).textTheme.body1,
                                      ),
                                    ),
                                  ],
                                ),
                              ),
                            );
                          }).toList(),
                        )
                      : Container(
                          padding: EdgeInsets.fromLTRB(0, 20, 0, 0),
                          child: Center(
                            child: SpinKitPulse(
                              color: Theme.of(context).primaryColor,
                              size: 50,
                            ),
                          ),
                        )
            ],
          ),
        ),
      ),
      contentPadding: EdgeInsets.fromLTRB(15, 10, 15, 0),
      actions: <Widget>[
        FlatButton(
          child: Text("Close"),
          onPressed: () {
            Navigator.of(context).pop();
          },
        ),
        FlatButton(
          child: Text("Ok"),
          onPressed: () {
            widget.onSubmit(
                sortOrderByValue, sortOrderValue, orderStatusOptions);
            Navigator.of(context).pop();
          },
        )
      ],
    );
  }

  Future<void> fetchOrderStatusOptions() async {
    String url =
        "${widget.baseurl}?consumer_key=${widget.username}&consumer_secret=${widget.password}";
    setState(() {
      isOrderStatusOptionsReady = false;
      isOrderStatusOptionsError = false;
    });
    http.Response response;
    try {
      response = await http.get(url);
      if (response.statusCode == 200) {
        if (json.decode(response.body) is List &&
            !json.decode(response.body).isEmpty) {
          Map<String, bool> tempMap = orderStatusOptions;
          json.decode(response.body).forEach((item) {
            if (item is Map &&
                item.containsKey("slug") &&
                item["slug"] is String &&
                item["slug"].isNotEmpty) {
              tempMap.putIfAbsent(item["slug"], () => false);
            }
          });
          setState(() {
            isOrderStatusOptionsReady = true;
            orderStatusOptions = tempMap;
          });
        } else {
          setState(() {
            isOrderStatusOptionsReady = false;
            isOrderStatusOptionsError = true;
            orderStatusOptionsError = "Failed to fetch order status options";
          });
        }
      } else {
        String errorCode = "";
        if (json.decode(response.body) is Map &&
            json.decode(response.body).containsKey("code") &&
            json.decode(response.body)["code"] is String) {
          errorCode = json.decode(response.body)["code"];
        }
        setState(() {
          isOrderStatusOptionsReady = false;
          isOrderStatusOptionsError = true;
          orderStatusOptionsError =
              "Failed to fetch order status options. Error: $errorCode";
        });
      }
    } catch (e) {
      setState(() {
        isOrderStatusOptionsReady = false;
        isOrderStatusOptionsError = true;
        orderStatusOptionsError =
            "Failed to fetch order status options. Error: $e";
      });
    }
  }
}


0 commentaires