#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 buildsListView.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;
});
});