flutter 躺坑之路
2021-10-29 本文已影响0人
Deck方
1.编译提示错误 The values in a const list literal must be constants
错误代码:
class RichTextMultipleWidget extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _RichTextMultipleState();
}
}
class _RichTextMultipleState extends State<RichTextMultipleWidget> {
bool _toggle = false;
TapGestureRecognizer _tapGestureRecognizer = TapGestureRecognizer();
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
RichText(
text: TextSpan(
text: 'Hello ',
style: DefaultTextStyle
.of(context)
.style,
children:const <TextSpan>[
TextSpan(text: 'Hi, ', style: TextStyle(letterSpacing: 5)),
TextSpan(
//这里提示 编译错误 The values in a const list literal must be constants
text: _toggle ? 'OK' : 'NO',
style: TextStyle(
fontSize: 26,
//这里提示 编译错误 The values in a const list literal must be constants
color: _toggle ? Colors.purple : Colors.orange),
//这里提示 编译错误 The values in a const list literal must be constants
recognizer: _tapGestureRecognizer..onTap=(){
setState(() {
_toggle = !_toggle;
});
}
)
]))
],
);
}
@override
void dispose() {
_tapGestureRecognizer.dispose();
super.dispose();
}
}
原因:父容器使用了 const
关键字修饰 ,本示例中使用const
关键字修饰了children
导致编译错误
修改:在build方法体中去掉children
前的const
,我遇到的是这种情况,其他情况可查找类似情形
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
RichText(
text: TextSpan(
text: 'Hello ',
style: DefaultTextStyle
.of(context)
.style,
children: <TextSpan>[
TextSpan(text: 'Hi, ', style: TextStyle(letterSpacing: 5)),
TextSpan(
//这里提示 编译错误 The values in a const list literal must be constants
text: _toggle ? 'OK' : 'NO',
style: TextStyle(
fontSize: 26,
color: _toggle ? Colors.purple : Colors.orange),
recognizer: _tapGestureRecognizer..onTap=(){
setState(() {
_toggle = !_toggle;
});
}
)
]))
],
);
}
拓展Dart中的final
和const
的异同
1.相同点
- 声明的类型可以省略
final f1="111";
final String f2="111";
const c1="111";
const String c2 ="111";
- 初始化后不能赋值
- 不能和var同时使用
2.区别(需要注意的地方)
- 类级别的常量使用
static const
-
const
可以使用其他const
常量的值初始化其他值 - 使用
const
赋值声明,const
可省略 - 可以更改飞
final
、非const
变量的值,即使曾经具有const
值 -
const
导致的不可变性是可传递的 - 相同的
const
常量不会在内存中重复创建 -
const
需要是编译时常量