如何将无状态小部件变成有状态小部件?

时间:2021-07-12 08:21:51

标签: flutter statefulwidget

我必须根据不断变化的字符串参数将无状态小部件变成有状态小部件。我试图从实际的小部件中获取字符串,但遇到了错误

它是一个彩色指示器,在状态字符串之后改变其颜色,但我无法在状态类中获取该字符串

我试过了,我该怎么办?

class ChStatus extends StatefulWidget{
  final String status1;
  //final String color;

  getStatus(){ return this.status1 }

  ChStatus(this.status1);

  @override

  _ChStatusState createState() => _ChStatusState();

}

class _ChStatusState extends State<ChStatus>{
  String status = widget.status1;

  @override
  Widget build(context) {
    // TODO: implement build
    switch (status) {
      case ("active"):
        return Row(
          children: [
            Container(
                margin: EdgeInsets.only(left:20.0, right:10.0),
                padding: EdgeInsets.only(left:7.0, top:7,right:7.0,bottom:7.0),
                decoration: const ShapeDecoration(
                  color: Colors.green,
                  shape: CircleBorder(),
                )
            ),

            Text(
              //S.of(context).challengeTitle,
                status,
                style: TextStyle(fontSize: 16)
            )
          ],
        );

      case ("pending"):
        return Row(
          children: [
            Container(
                margin: EdgeInsets.only(left:20.0, right:10.0),
                padding: EdgeInsets.only(left:7.0, top:7,right:7.0,bottom:7.0),
                decoration: const ShapeDecoration(
                  color: Colors.blue,
                  shape: CircleBorder(),
                )
            ),

            Text(
              //S.of(context).challengeTitle,
                status,
                style: TextStyle(fontSize: 16)
            )
          ],
        );

      case ("rejected"):
        return Row(
          children: [
            Container(
                margin: EdgeInsets.only(left:20.0, right:10.0),
                padding: EdgeInsets.only(left:7.0, top:7,right:7.0,bottom:7.0),
                decoration: const ShapeDecoration(
                  color: Colors.red,
                  shape: CircleBorder(),
                )
            ),

            Text(
              //S.of(context).challengeTitle,
                status,
                style: TextStyle(fontSize: 16)
            )
          ],
        );

      case ("done"):
        return Row(
          children: [
            Container(
                margin: EdgeInsets.only(left: 20.0, right: 10.0),
                child: Icon(
                  Icons.check,
                  color: Colors.yellow,
                  size: 20.0,
                )
            ),

            Text(
              //S.of(context).challengeTitle,
                status,
                style: TextStyle(fontSize: 16)
            )
          ],
        );

      default:
        return Row(
          children: [
            Container(
                margin: EdgeInsets.only(left:20.0, right:10.0),
                child: Icon(
                  Icons.device_unknown,
                  color: Colors.purple,
                  size: 20.0,
                )
            ),

            Text(
              //S.of(context).challengeTitle,
                "Unknown",
                style: TextStyle(fontSize: 16)
            )
          ],
        );
    }
    throw UnimplementedError();
  }
}

1 个答案:

答案 0 :(得分:0)

第一,我们不需要使用这个方法。您也缺少 ; 行尾。

getStatus() {
    return this.status1;
  }

我们可以简单地使用 widget.status1 来获取字符串。 即使你想使用那种方法。

使用initState()来设置数据,比如

class _ChStatusState extends State<ChStatus> {
  late String status;

  @override
  void initState() {
    super.initState();
    status = widget.getStatus();
  }


它没有解决您的问题吗?