跳至主要內容

future

chanchaw大约 1 分钟flutter

doc

案例

该方法一般用于在接受异步数据后决定跳转的页面,比如是跳转到登录页面还是首页,下面是测试通过的案例

import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:netstorage/ResponseResult.dart';

class FutureStudy extends StatefulWidget {
  const FutureStudy({super.key});

  
  State<FutureStudy> createState() => _FutureStudyState();
}

class _FutureStudyState extends State<FutureStudy> {
  var postRes = '';
  
  Widget build(BuildContext context) {
    // return const Placeholder();
    return Scaffold(
      appBar: AppBar(title: Text('FutureStudy')),
      // 异步请求响应来的实体类是 ResponseResult
      body: FutureBuilder<ResponseResult>(
          future: fetchPost(),
          builder: (BuildContext context, AsyncSnapshot<ResponseResult> snapshot){
            switch(snapshot.connectionState){
              case ConnectionState.none:
                return const Text('state none');
              case ConnectionState.waiting:
                return const Center(child: CircularProgressIndicator());
              case ConnectionState.active:
                return const Text('state active');
              case ConnectionState.done:
                if(snapshot.hasError){
                  return Text('${snapshot.error}',style: const TextStyle(color: Colors.red));
                }else{
                  // snapshot.data = ResponseResult
                  Map<String,String>? map = snapshot.data?.data;
                  print('响应结果:$snapshot.data');
                  print('响应来的数据:$map');
                  String? msg = snapshot.data?.msg;
                  String? proxyUrl = '';
                  if(map != null) proxyUrl = map['proxyUrl'];
                  return Column(
                    children: [
                      Text('proxyUrl:$proxyUrl'),
                      Text('msg:$msg'),
                    ],
                  );
                }
            }
          },
      ),
    );
  }

  Future<ResponseResult<Map<String,String>>>? fetchPost() async {
    var uri = Uri.parse('https://www.xdfznh.club/wxpadbe/dev/proxyUrl');
    var params = {'rawUrl':'https://jzy.world'};
    var res = await http.post(
      uri,
      body: jsonEncode(params),
      headers: {
        'Content-Type': 'application/json; charset=UTF-8', // 关键:设置 Content-Type
      },
    );
    if(res.statusCode == 200){
      // 解析 json 数据为实体类
      var body = jsonDecode(res.body);

      // 上面接口响应来的是 Map<String,String> 而不是 ResponseResult
      // 所以要手动构建,保证异步请求方法返回数据的统一性
      ResponseResult<Map<String,String>> rr = ResponseResult();
      Map<String,String> mapData = {'proxyUrl':body['proxyUrl']};
      rr.code = 0; rr.success = true; rr.msg = '手动创建的响应结果'; rr.data = mapData;

      return rr;
    }else{
      print('异步请求出现异常');
      return ResponseResult.empty();
    }
  }
}