Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter StatefulWidget中的setState()工作不正常_Flutter_Dart_Statefulwidget - Fatal编程技术网

Flutter StatefulWidget中的setState()工作不正常

Flutter StatefulWidget中的setState()工作不正常,flutter,dart,statefulwidget,Flutter,Dart,Statefulwidget,我想做的是,在单击按钮时更改RawMaterialButton的颜色。阅读有关StatefulWidget的文章,它看起来应该可以工作,但由于某些原因它不能工作 flatter:引发了另一个异常:在构造函数:ButtonTest#1a93b中调用了setState()(生命周期状态:已创建,无小部件,未装入) 按钮测试等级: class ButtonState extends StatefulWidget { @override State createState() => But

我想做的是,在单击按钮时更改
RawMaterialButton
的颜色。阅读有关StatefulWidget的文章,它看起来应该可以工作,但由于某些原因它不能工作

flatter:引发了另一个异常:在构造函数:ButtonTest#1a93b中调用了setState()(生命周期状态:已创建,无小部件,未装入)

按钮测试等级:

class ButtonState extends StatefulWidget {
  @override
  State createState() => ButtonTest();
}

class ButtonTest extends State<ButtonState> implements Cipher {
  @override
  String icon = '';

  @override
  String title = '';

  bool enabled = false;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(this.title),
      ),
      body: RawMaterialButton(
          shape: CircleBorder(side: BorderSide(color: Colors.black)),
          fillColor: enabled ? Colors.blue : Colors.red,
          onPressed: () {
            setState(() {
              this.enabled = true;
            });
          },
          padding: EdgeInsets.all(0)),
    );
  }
}
getCiphers()

getCiphers(){
最终列表密码=新列表();
add(ButtonTest());
返回密码;
}
主要类别:

void main() => runApp(CipherTools());

class CipherTools extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'CipherTools',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: CipherScreen(
        ciphers: getCiphers(),
      ),
    );
  }
}

class CipherScreen extends StatelessWidget {
  final List<Cipher> ciphers;

  CipherScreen({Key key, @required this.ciphers}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Ciphers'),
      ),
      body: ListView.builder(
        itemCount: ciphers.length,
        itemBuilder: (context, index) {
          return ListTile(
            title: Text(ciphers[index].title),
            // When a user taps on the ListTile, navigate to the DetailScreen.
            // Notice that we're not only creating a DetailScreen, we're
            // also passing the current todo through to it!
            onTap: () {
              Navigator.push(
                context,
                MaterialPageRoute(
                  builder: (context) => DetailScreen(cipher: ciphers[index]),
                ),
              );
            },
          );
        },
      ),
    );
  }
}

class DetailScreen extends StatelessWidget {
  // Declare a field that holds the Todo
  final Cipher cipher;

  // In the constructor, require a Todo
  DetailScreen({Key key, @required this.cipher}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return cipher.build(context);
  }
}
void main()=>runApp(CipherTools());
类CipherTools扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“密码工具”,
主题:主题数据(
主样本:颜色。蓝色,
),
主页:密码屏幕(
密码:getCiphers(),
),
);
}
}
类CipherScreen扩展了无状态小部件{
最终列表密码;
密码屏幕({Key Key,@required this.ciphers}):超级(Key:Key);
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“密码”),
),
正文:ListView.builder(
itemCount:ciphers.length,
itemBuilder:(上下文,索引){
返回列表块(
标题:文本(密码[索引]),
//当用户点击ListTile时,导航到Detail屏幕。
//请注意,我们不仅创建了DetailScreen,而且
//也将当前的todo传递给它!
onTap:(){
导航器。推(
上下文
材料路线(
生成器:(上下文)=>DetailScreen(密码:密码[索引]),
),
);
},
);
},
),
);
}
}
类DetailScreen扩展了无状态小部件{
//声明保存Todo的字段
最终密码;
//在构造函数中,需要Todo
DetailScreen({Key Key,@required this.cipher}):super(Key:Key);
@凌驾
小部件构建(构建上下文){
返回cipher.build(上下文);
}
}
我做错了什么?

有几件事:

  • ButtonState
    应称为
    ButtonTest
    ,因为这是
    StatefulWidget
  • ButtonTest
    应称为
    ButtonTestState
    ,因为这是
    状态
然后在
DetailScreen
中的
build()
方法中,可以返回
StatefulWidget
ButtonTest
),如下所示:

@override
Widget build(BuildContext context) {
  return ButtonTest();
}
像这样包装setState()

 if(this.mounted) {
      setState(() {
          this.enabled = true;
        });
 }
请点击链接->
@override
Widget build(BuildContext context) {
  return ButtonTest();
}
 if(this.mounted) {
      setState(() {
          this.enabled = true;
        });
 }