刚开始学习flutter时,以下代码都非常熟悉
class FirstPage extends StatefulWidget {
@override
createState() => new FirstPageState();
}
class FirstPageState extends State<FirstPage> {
@override
Widget build(BuildContext context) {
return new Text('hello word');
}
}
其中就很奇怪这个尖括号是干什么的,以为是固定写法。
oc语言中类接口中尖括号通常表示类符合的协议。例如
@interface TestViewController ()<UITableViewDelegate,UITableViewDataSource>
表示TestViewController要遵从后面的协议
NSArray<NSString *> *array;
表示数组里存放的是字符串类型。其实这一点和dart中的用法是一致的
var names = List<String>();
names.addAll(['zhangsan', 'lisi', '王五']);
names.add(123); // Error
最后一句增加整型就会报错,因为<String>表示names中只接受字符串类型
其实我们从它延展开来就是范型,范型是在不确定类型情况下使用的
比如我们同样定义一个数组list,它可以即支持整型、也可以支持字符串
var names = List<T>();
在上述数组中我们可能还不好理解,放到下面例子就容易理解多了
class SomeThingStr {
String getWithKey(String key);
void setWithKey(String key, String value);
}
这是一个存放String的类,但是如果我想存放其他类型需要改成下面样子
class SomeThingList {
List getWithKey(String key);
void setWithKey(String key, List value);
}
想改成任意类型我可以用范型来实现
class SomeThingObject<T> {
T getWithKey(String key);
void setWithKey(String key, T value);
}
这样做可以实现对多种数据类型的适配,并且同时可以进行静态代码检查。
其实最开始并没有太理解类后面<>是什么意思,以为和List<String>是一样的,其实class SomeThingObject<T> 只是一种声明,声明里面所有的T都代表一种同样的类型。
那么回到最开始的问题
class FirstPageState extends State<FirstPage> {
}
这里的<FirstPage>是什么意思,其实我们看一下源码State的实现就明白了
abstract class State<T extends StatefulWidget> with Diagnosticable {
T get widget => _widget!;
T? _widget;
_StateLifecycle _debugLifecycleState = _StateLifecycle.created;
........
........
}
我们截取部分代码,State中声明了范型T,T需要是StatefulWidget的子类,我们在声明FirstPageState时设置了这个范型T为FirstPage类。那么FirstPageState中子类里的范型T都是FirstPage类型。
同样看下list的
abstract class List<E> implements EfficientLengthIterable<E> {
........
........
}
其实都是一样的,尖括号就是表示的范型
网友评论