如果在initState()中创建,则Flutter Switch小部件不起作用

时间:2018-08-30 09:01:57

标签: dart widget flutter

我试图创建一个Switch小部件,将其添加到initState内部的小部件列表中,然后将此列表添加到build方法中的Column的children属性中。该应用程序已成功运行,并且确实显示了“开关”小部件,但单击它并不会更改它,就好像它不起作用一样。我尝试在build方法中制作相同的小部件,并且Switch可以按预期工作。

我在_onClicked中添加了一些注释,这些注释已分配给Switch小部件的onChanged属性,以显示value属性的流程。

import 'package:flutter/material.dart';

void main() {
  runApp(new MaterialApp(
    home: App(),
  ));
}

class App extends StatefulWidget {
  @override
  AppState createState() => new AppState();
}

class AppState extends State<App> {

  List<Widget> widgetList = new List<Widget>();
  bool _value = false;

  void _onClicked(bool value) {
    print(_value); // prints false the first time and true for the rest
    setState(() {
      _value = value;
    });
    print(_value); // Always prints true
  }

  @override
  void initState() {
    Switch myWidget = new Switch(value: _value, onChanged: _onClicked);
    widgetList.add(myWidget);
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('My AppBar'),
      ),
      body: new Container(
        padding: new EdgeInsets.all(32.0),
        child: new Center(
          child: new Column(children: widgetList),
        ),
      ),
    );
  }
}

1 个答案:

答案 0 :(得分:1)

initState用于初始化状态,而不是小部件。 build用于创建小部件。

失败的原因是,当值更改时(当您调用setState时,需要重新构建窗口小部件,但这并不是因为在调用build()时,先前的(在{ {1}})创建的窗口小部件被重复使用。

initState