一.父子组件通信代码实例:
import 'package:dio/dio.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; void main(List<String> args) { runApp(MainPage()); print("成功进入主程序调用MainPage()函数"); } class MainPage extends StatefulWidget { MainPage({Key? key}) : super(key: key); @override _MainPageState createState() => _MainPageState(); } class _MainPageState extends State<MainPage> { @override void initState() { // TODO: implement initState super.initState(); _getChannels(); print("成功调用_getChannels"); } List<Map<String, dynamic>> _list = []; void _getChannels() async { //async和await实现异步能够接收到get发送后返回的请求 DioUtils util = DioUtils(); //实例化DioUtils类的对象 print("在_getChannels中成功实例化对象"); Response<dynamic> result = await util.get("channels"); Map<String, dynamic> res = result.data as Map<String, dynamic>; //强制类型转换存储接收到的数据,一定是一个键为字符串、值任意类型的 Map List data = res["data"]["channels"] as List; //处理接收到的数据,只读取data中的channels中的内容 _list = data.cast<Map<String, dynamic>>() as List< Map<String, 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 Map<String, 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方法 Future<Response<dynamic>> get(String url, {Map<String, dynamic>? params}) { print("成功调用实例化对象util的get方法"); return _dio.get(url, queryParameters: params); } }
![]()