Флаттер: захват ответа в будущем от http-звонка как обычного списка - PullRequest
0 голосов
/ 16 апреля 2019

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

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

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; который затем использовал бы это, чтобы создать виджет DropDown (или отобразить его в тексте)

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

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}'];
  }


}

P.S. Я просмотрел несколько постов, но был полностью потрясен, так как я новичок по флаттеру

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

Спасибо

Виджет, который будет отображать содержимое из 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(),
    );
...