拨打网络电话的最佳方法是什么?

时间:2019-07-26 11:57:36

标签: flutter

我对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()完成的。但是想知道如何将不同的部分组合在一起以编写最佳代码。 任何帮助将不胜感激。

1 个答案:

答案 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);
  }
}

这样,每篇文章都写在不同的位置,并且非常容易增强/调试/查找错误(如果有)。