ouyanghan
Committed by GitHub

Update README.zh-cn.md

update to english version
@@ -37,6 +37,17 @@ _语言: 中文, [英文](README.md), [越南文](README-vi.md), [印度尼西 @@ -37,6 +37,17 @@ _语言: 中文, [英文](README.md), [越南文](README-vi.md), [印度尼西
37 - [改变语言](#改变语言) 37 - [改变语言](#改变语言)
38 - [系统语言](#系统语言) 38 - [系统语言](#系统语言)
39 - [改变主题](#改变主题) 39 - [改变主题](#改变主题)
  40 + - [GetConnect](#getconnect)
  41 + - [默认配置](#默认配置)
  42 + - [自定义配置](#自定义配置)
  43 + - [GetPage 中间件](#getpage-中间件)
  44 + - [优先级](#优先级)
  45 + - [Redirect](#redirect)
  46 + - [onPageCalled](#onpagecalled)
  47 + - [OnBindingsStart](#onbindingsstart)
  48 + - [OnPageBuildStart](#onpagebuildstart)
  49 + - [OnPageBuilt](#onpagebuilt)
  50 + - [OnPageDispose](#onpagedispose)
40 - [其他高级API](#其他高级api) 51 - [其他高级API](#其他高级api)
41 - [可选的全局设置和手动配置](#可选的全局设置和手动配置) 52 - [可选的全局设置和手动配置](#可选的全局设置和手动配置)
42 - [局部状态组件](#局部状态组件) 53 - [局部状态组件](#局部状态组件)
@@ -394,6 +405,163 @@ Get.changeTheme(Get.isDarkMode? ThemeData.light(): ThemeData.dark()); @@ -394,6 +405,163 @@ Get.changeTheme(Get.isDarkMode? ThemeData.light(): ThemeData.dark());
394 405
395 `.darkmode`被激活时,它将切换到light主题,当light主题被激活时,它将切换到dark主题。 406 `.darkmode`被激活时,它将切换到light主题,当light主题被激活时,它将切换到dark主题。
396 407
  408 +## GetConnect
  409 +
  410 +GetConnect可以便捷的通过http或websockets进行前后台通信。
  411 +
  412 +### 默认配置
  413 +
  414 +你能轻松的通过extend GetConnect就能使用GET/POST/PUT/DELETE/SOCKET方法与你的Rest API或websockets通信。
  415 +
  416 +```dart
  417 +class UserProvider extends GetConnect {
  418 + // Get request
  419 + Future<Response> getUser(int id) => get('http://youapi/users/$id');
  420 + // Post request
  421 + Future<Response> postUser(Map data) => post('http://youapi/users', body: data);
  422 + // Post request with File
  423 + Future<Response<CasesModel>> postCases(List<int> image) {
  424 + final form = FormData({
  425 + 'file': MultipartFile(image, filename: 'avatar.png'),
  426 + 'otherFile': MultipartFile(image, filename: 'cover.png'),
  427 + });
  428 + return post('http://youapi/users/upload', form);
  429 + }
  430 +
  431 + GetSocket userMessages() {
  432 + return socket('https://yourapi/users/socket');
  433 + }
  434 +}
  435 +```
  436 +
  437 +### 自定义配置
  438 +
  439 +GetConnect具有多种自定义配置。你可以配置base Url,配置响应,配置请求,添加权限验证,甚至是尝试认证的次数,除此之外,还可以定义一个标准的解码器,该解码器将把您的所有请求转换为您的模型,而不需要任何额外的配置。
  440 +
  441 +```dart
  442 +class HomeProvider extends GetConnect {
  443 + @override
  444 + void onInit() {
  445 + // All request will pass to jsonEncode so CasesModel.fromJson()
  446 + httpClient.defaultDecoder = CasesModel.fromJson;
  447 + httpClient.baseUrl = 'https://api.covid19api.com';
  448 + // baseUrl = 'https://api.covid19api.com'; // It define baseUrl to
  449 + // Http and websockets if used with no [httpClient] instance
  450 +
  451 + // It's will attach 'apikey' property on header from all requests
  452 + httpClient.addRequestModifier((request) {
  453 + request.headers['apikey'] = '12345678';
  454 + return request;
  455 + });
  456 +
  457 + // Even if the server sends data from the country "Brazil",
  458 + // it will never be displayed to users, because you remove
  459 + // that data from the response, even before the response is delivered
  460 + httpClient.addResponseModifier<CasesModel>((request, response) {
  461 + CasesModel model = response.body;
  462 + if (model.countries.contains('Brazil')) {
  463 + model.countries.remove('Brazilll');
  464 + }
  465 + });
  466 +
  467 + httpClient.addAuthenticator((request) async {
  468 + final response = await get("http://yourapi/token");
  469 + final token = response.body['token'];
  470 + // Set the header
  471 + request.headers['Authorization'] = "$token";
  472 + return request;
  473 + });
  474 +
  475 + //Autenticator will be called 3 times if HttpStatus is
  476 + //HttpStatus.unauthorized
  477 + httpClient.maxAuthRetries = 3;
  478 + }
  479 + }
  480 +
  481 + @override
  482 + Future<Response<CasesModel>> getCases(String path) => get(path);
  483 +}
  484 +```
  485 +
  486 +## GetPage 中间件
  487 +
  488 +GetPage现在有个新的参数可以把列表中的Get中间件按指定顺序执行。
  489 +
  490 +**注意**: 当GetPage有中间件时,所有的子page会自动有相同的中间件。
  491 +
  492 +### 优先级
  493 +
  494 +设置中间件的优先级定义Get中间件的执行顺序。
  495 +
  496 +```dart
  497 +final middlewares = [
  498 + GetMiddleware(priority: 2),
  499 + GetMiddleware(priority: 5),
  500 + GetMiddleware(priority: 4),
  501 + GetMiddleware(priority: -8),
  502 +];
  503 +```
  504 +
  505 +这些中间件会按这个顺序执行 **-8 => 2 => 4 => 5**
  506 +
  507 +### Redirect
  508 +
  509 +当被调用路由的页面被搜索时,这个函数将被调用。它将RouteSettings作为重定向的结果。或者给它null,就没有重定向了。
  510 +
  511 +```dart
  512 +RouteSettings redirect(String route) {
  513 + final authService = Get.find<AuthService>();
  514 + return authService.authed.value ? null : RouteSettings(name: '/login')
  515 +}
  516 +```
  517 +
  518 +### onPageCalled
  519 +
  520 +在调用页面时,创建任何东西之前,这个函数会先被调用。
  521 +您可以使用它来更改页面的某些内容或给它一个新页面。
  522 +
  523 +```dart
  524 +GetPage onPageCalled(GetPage page) {
  525 + final authService = Get.find<AuthService>();
  526 + return page.copyWith(title: 'Welcome ${authService.UserName}');
  527 +}
  528 +```
  529 +
  530 +### OnBindingsStart
  531 +
  532 +这个函数将在绑定初始化之前被调用。
  533 +在这里,您可以更改此页面的绑定。
  534 +
  535 +```dart
  536 +List<Bindings> onBindingsStart(List<Bindings> bindings) {
  537 + final authService = Get.find<AuthService>();
  538 + if (authService.isAdmin) {
  539 + bindings.add(AdminBinding());
  540 + }
  541 + return bindings;
  542 +}
  543 +```
  544 +
  545 +### OnPageBuildStart
  546 +
  547 +这个函数将在绑定初始化之后被调用。
  548 +在这里,您可以在创建绑定之后和创建页面widget之前执行一些操作。
  549 +
  550 +```dart
  551 +GetPageBuilder onPageBuildStart(GetPageBuilder page) {
  552 + print('bindings are ready');
  553 + return page;
  554 +}
  555 +```
  556 +
  557 +### OnPageBuilt
  558 +
  559 +这个函数将在GetPage.page调用后被调用,并给出函数的结果,并获取将要显示的widget。
  560 +
  561 +### OnPageDispose
  562 +
  563 +这个函数将在处理完页面的所有相关对象(Controllers, views, ...)之后被调用。
  564 +
397 ## 其他高级API 565 ## 其他高级API
398 566
399 ```dart 567 ```dart