Трепетание: захват будущего ответа от http-вызова в виде обычного списка

#dart #flutter #dart-webui

#дротик #трепетание #dart-webui

Вопрос:

Я пытаюсь сделать свое ранее статическое приложение динамическим, делая вызовы на внутренний сервер.

Вот как выглядит мой сервис

 String _url = "http://localhost:19013/template/listAll";

Future<List<TemplateInfoModel>> fetchTemplates() async {
  final response =
  await http.get(_url);
  print(response.statusCode);

  if (response.statusCode == 200) {
    // If the call to the server was successful, parse the JSON
    Iterable l = json.decode(response.body);
    List<TemplateInfoModel> templates = l.map((i) => TemplateInfoModel.fromJson(i)).toList();
    return templates;
  } else {
  // If that call was not successful, throw an error.
  throw Exception('Failed to load post');
  }
}
  

И моя модель выглядит так :

 class TemplateInfoModel {
  final String templateId;
  final String messageTag;
  final String message;
  final String messageType;


  TemplateInfoModel({this.templateId, this.messageTag, this.message,
    this.messageType});

  factory TemplateInfoModel.fromJson(Map<String, dynamic> json) {
    return TemplateInfoModel ( templateId: json['templateId'], messageTag : json['messsageTag'], message : json ['message'] , messageType : json['messageType']);
  }

}
  

У меня есть метод utils, в котором я собираю данные http-запроса / ответа; который затем будет использовать это для создания выпадающего виджета (или отображения его в тексте)

Мои предыдущие фиктивные данные были списком; Мне интересно, как лучше всего я могу преобразовать это будущее> в список

 class SMSTemplatingEngine {

    var _SMSTemplate; //TODO this becomes a Future<List<TemplateInfoModels>>
   // TemplateInfoService _templateInfoService;

    SMSTemplatingEngine(){
      _SMSTemplate=fetchTemplates();
    }

//  var _SMSTemplate = {
//    'Reminder':
//        'Reminder : We’re excited to launch a new feature on our platform that will revolutionize your Facebook marketing and triple your ROI. Visit url.com to learn more',
//    'New Message':
//        'New Message: We’re excited to launch a new feature on our platform that will revolutionize your Facebook marketing and triple your ROI. Visit url.com to learn more',
//    'Connecting Again':
//        'Connecting Again : We’re excited to launch a new feature on our platform that will revolutionize your Facebook marketing and triple your ROI. Visit url.com to learn more',
//  };

  List<String> getKeys(){
    List<String> smsKeys = new List();
    for ( var key in _SMSTemplate.keys)
      smsKeys.add(key);
    return smsKeys;
  }

  String getValuePerKey(String key){
    return _SMSTemplate['${key}'];
  }


}
  

PS Я просмотрел несколько сообщений, но я был полностью поражен, так как я новичок в Flutter.

Есть ли более простой способ для этого.

Спасибо,

Виджет, который будет отображать содержимое из http-вызова

    var templateMessagesDropDown = new DropdownButton<String>(
      onChanged: (String newValue) {
        setState(() {
          templateMsgKey = newValue;
          print("Selcted : ${templateMsgKey.toString()} ");
        });
      },
      // value: _defaultTemplateValue,
      style: textStyle,
      //elevation: 1,
      hint: Text("Please choose a template"),
      isExpanded: true,
      //
      items: smsEngine.getKeys().map<DropdownMenuItem<String>>((String value) {
        return DropdownMenuItem<String>(
          value: value,
          child: Text(value),
        );
      }).toList(),
    );
  

Комментарии:

1. используйте FutureBuilder which builds ListView.builder — что-то вроде этого

2. @pskink Я не хочу вызывать FutureBuilder и надеюсь, что смогу создать List<T> вместо Future<List<T>>

3. что вы тогда хотите сделать с этим списком?

4. @pskink, вызываемый внутри этого метода компоновщика, который создает форму;

5. итак, как я уже сказал: используйте FutureBuilder внутри вашего build() метода

Ответ №1:

Мне интересно, как лучше всего я могу преобразовать это будущее в список

Future<List<TemplateInfoModel>> fetchTemplates() должен вернуть список, который вы ожидаете. Возможно, вы захотите рассмотреть возможность использования FutureBuilder или StreamBuilder для обновления элементов пользовательского интерфейса на вашем экране. Или, если вы не заинтересованы в использовании ни того, ни другого, вы можете просто вызвать будущее и обновить список на текущем экране.

 List<TemplateInfoModel> _listTemplateInfoModel = [];
...

fetchTemplates().then((value){
  setState((){
    _listTemplateInfoModel = value;
  });
});