我对Flutter很陌生。我想知道在编写网络调用最佳实践方面的最佳方法是什么。
我在互联网(包括Stackoverflow)上搜索了如何进行REST调用(GET,POST),并找到了一些代码示例。例如,下面给出其中之一。
new RaisedButton(
onPressed: () async {
Post newPost = new Post(
userId: "123", id: 0, title: titleControler.text, body: bodyControler.text);
Post p = await createPost(CREATE_POST_URL,
body: newPost.toMap());
print(p.title);
},
)
现在,我认为在onPressed()中合并所有内容不是一个好主意。我特别想知道如何在页面加载之前适应网络调用(或在获取数据后进行更新)。我知道这是通过setState()完成的。但是想知道如何将不同的部分组合在一起以编写最佳代码。 任何帮助将不胜感激。
答案 0 :(得分:0)
最好的方法是使每个部分简短且仅针对一项任务。这不是Flutter特有的(通常适用于任何编码)。这样做的一种类型如下:
假设您要从API获取员工列表。
定义Employee类,指定强制/非强制属性等。还编写.fromJson()进行实例化。
从如下所示的有状态小部件中的didChangeDependencies开始。
@override
void didChangeDependencies() {
super.didChangeDependencies();
_requestEmployeeListFromAPI();
}
_requestDataFromAPI()函数将只是网络调用的指针,如下所示:
Future<void> _requestEmployeeListFromAPI() async {
try {
_myList = await network.getEmployeeList();
} catch (exception) {
print(exception);
// ...
} else {
// show exception
}
} finally {
if (mounted) {
setState(() => _isLoadingCompleted = true);
}
}
}
根据_isLoadingCompleted的值处理用户界面
现在,您的网络文件可能包含项目中要进行的所有网络调用。下面的示例:
Future<List<Employee>> getEmployeeList() async {
try {
http.Response response = await http.post(
"$getEmployeeListUrl",
);
Map<String, dynamic> decodedBody = json.decode(response.body);
print(decodedBody);
List<Employee> employeeList = (decodedBody["EmployeeList"] as List)
.map((element) => Employee.fromJson(element))
.toList();
return employeeList;
} catch (e) {
print(e);
}
}
这样,每篇文章都写在不同的位置,并且非常容易增强/调试/查找错误(如果有)。