一.父子组件通信代码实例import package:dio/dio.dart; import package:flutter/cupertino.dart; import package:flutter/material.dart; void main(ListString args) { runApp(MainPage()); print(成功进入主程序调用MainPage函数); } class MainPage extends StatefulWidget { MainPage({Key? key}) : super(key: key); override _MainPageState createState() _MainPageState(); } class _MainPageState extends StateMainPage { override void initState() { // TODO: implement initState super.initState(); _getChannels(); print(成功调用_getChannels); } ListMapString, dynamic _list []; void _getChannels() async { //async和await实现异步能够接收到get发送后返回的请求 DioUtils util DioUtils(); //实例化DioUtils类的对象 print(在_getChannels中成功实例化对象); Responsedynamic result await util.get(channels); MapString, dynamic res result.data as MapString, dynamic; //强制类型转换存储接收到的数据一定是一个键为字符串、值任意类型的 Map List data res[data][channels] as List; //处理接收到的数据只读取data中的channels中的内容 _list data.castMapString, dynamic() as List MapString, dynamic ; //cast声明元素类型但cast返回的是Iterable所以后面用List再重新转换回来 setState(() {}); print(_list); } override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( body: GridView.extent( padding: EdgeInsets.all(10), maxCrossAxisExtent: 140, mainAxisSpacing: 10, crossAxisSpacing: 10, childAspectRatio: 3, //generate快速生成一个列表并遍历从处理的数据第0个开始到length-1个结束这里相当于for循环(index)从0开始取值到_list.length-1 children: List.generate(_list.length, (index) { return ChannelItem( item: _list[index], ); //向channelItem组件发送_list列表中的每一个元素。 }), ), appBar: AppBar(title: Text(频道管理)), ), ); } } class ChannelItem extends StatelessWidget { final MapString, dynamic item; const ChannelItem({Key? key, required this.item}) : super(key: key); override Widget build(BuildContext context) { return Container( color: Colors.blue, alignment: Alignment.center, child: Text( item[name] ?? 空, style: TextStyle(color: Colors.white, fontSize: 14), ), ); } } //封装一个工具类 class DioUtils { final Dio _dio Dio(); //表示_dio这个内部变量是Dio类型且只能赋值一次Dio()是dio三方库自带的构造函数这里相当于实例化了一个_dio对象。 DioUtils() { // _dio.options.baseUrl htps://tgeek.itheima.net/v1_0/; // // _dio.options.connectTimeout Duration(seconds: 10); //连接超时 // _dio.options.sendTimeout Duration(seconds: 10); //发送超时 // _dio.options.receiveTimeout Duration(seconds: 10); //接收超时 _dio.options ..baseUrl https://geek.itheima.net/v1_0/ //..简洁写法连续赋值写法 ..connectTimeout Duration(seconds: 10) ..sendTimeout Duration(seconds: 10) ..receiveTimeout Duration(seconds: 10); _addInterceptor(); //调用封装好的拦截器方法 } void _addInterceptor() { //用函数封装拦截器方法 _dio.interceptors.add( //给_dio实例化对象添加拦截器 InterceptorsWrapper( onRequest: (options, handler) { handler.next(options); //表示通过了检查可以去往下一个拦截器或直接发送给服务器 // handler.reject(error); //表示不通过给你拦截住了 }, onResponse: (response, handler) { if (response.statusCode! 200 response.statusCode! 300) { //进行逻辑判断状态码是否合规进行放过或拦截决策 handler.next(response); return; } handler.reject( DioException(requestOptions: response.requestOptions), ); //拦截抛出异常 }, onError: (error, handler) { handler.reject(error); }, ), ); } //构造一个向外的get方法 FutureResponsedynamic get(String url, {MapString, dynamic? params}) { print(成功调用实例化对象util的get方法); return _dio.get(url, queryParameters: params); } }