微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

来自有状​​态父级的无状态小部件 dropdownButton 的设置状态

如何解决来自有状​​态父级的无状态小部件 dropdownButton 的设置状态

我有三个小部件,第一个是具有一些颜色属性LightBulb(stateless)。第二个是名为 LightColorSelector(stateless) 的小部件,它有一个 DropdownMenu,带有字符串类型项 RedGreenBlue。而且,第三个类是 Classroom(stateful widget),它是这两个类的父类。我的目标是设置该类的状态。 我需要在 Classroom 中设置这三种颜色的列表,当有人点击 LightColorSelector 项之一时,LightBulb 应该根据点击的颜色切换。但是,LightBulb 中的颜色始终返回 null。我认为它没有设置。实际上,我可能知道错误在哪里。我认为在 LightColorSelector 函数中有一个 onChanged 属性并且我没有将 value 设置到 func() 中。我在下面标记了我怀疑发生 mnistake 的地方。

import 'package:Flutter/material.dart';

// ignore: must_be_immutable
class LightBulb extends StatelessWidget {
  bool isLit;
  Color color;
  LightBulb(bool isLit,Color color) {
    this.isLit = isLit;
    this.color = color;
    print(color.toString());
  }

  Widget build(BuildContext context) {
    return Container(
      color: isLit ? color : Colors.red,padding: EdgeInsets.all(5),child: isLit ? Text('ON') : Text('OFF'),);
  }
}

class LightButton extends StatelessWidget {
  Function func;
  bool isLightOn;
  LightButton(Function func,bool iSLightOn) {
    this.func = func;
    this.isLightOn = iSLightOn;
  }
  String title() {
    if (isLightOn) return "Turn light off";
    return "Turn light on";
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      padding: EdgeInsets.symmetric(vertical: 4,horizontal: 12),color: Colors.red,child: Container(
        color: Colors.blue,child: MaterialButton(
          textColor: Colors.white,onpressed: () => func(),child: Text(
            title(),style: TextStyle(color: Colors.white),),);
  }
}

class Classroom extends StatefulWidget {
  @override
  _ClassroomState createState() => _ClassroomState();
}

class _ClassroomState extends State<Classroom> {
  bool isLightOn = false;
  String title = "Not set yet";
  List<Color> lightColor = [Colors.red,Colors.green,Colors.blue];
  Color color;
  String value;
  selectLightColor() {
    setState(() {
      if (value == 'Red') color = lightColor[0];
      if (value == 'Green') color = lightColor[1];
      if (value == 'Blue')
        color = lightColor[2];
      else
        color = Colors.Amber;
    });
  }

  onButtonpressed() {
    setState(() {
      isLightOn = !isLightOn;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Container(
        color: Colors.blue,child: Column(
          mainAxisAlignment: MainAxisAlignment.center,crossAxisAlignment: CrossAxisAlignment.center,children: [
            LightBulb(isLightOn,color),LightButton(onButtonpressed,isLightOn),LightColorSelector(selectLightColor),],);
  }
}

class LightColorSelector extends StatelessWidget {
  String initialVal = 'Red';
  Function func;
  LightColorSelector(Function func) {
    this.func = func;
  }

  @override
  Widget build(BuildContext context) {
    return Container(
        padding: EdgeInsets.all(10),child: DropdownButton(
          value: initialVal,onChanged: (value) => func,// =========== Here the error occurs ==========================
          items: <String>['Red','Green','Blue']
              .map<DropdownMenuItem<String>>((String value) {
            return DropdownMenuItem<String>(
              value: value,child: Text(value),);
          }).toList(),));
  }
}

样本输出

Output

解决方法

StatelessWidget 没有状态,因此您无法在无状态小部件中设置状态,这就是它称为无状态的原因。如果你想设置状态,你需要使用有状态的小部件

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?