美文网首页
flutter 躺坑之路

flutter 躺坑之路

作者: Deck方 | 来源:发表于2021-10-29 15:59 被阅读0次
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中的finalconst的异同

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需要是编译时常量

相关文章

网友评论

      本文标题:flutter 躺坑之路

      本文链接:https://www.haomeiwen.com/subject/heiialtx.html