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

问题描述 投票:0回答:1

我正在尝试创建一个Switch小部件,将其添加到initState中的小部件列表中,然后将此列表添加到构建方法中Column的children属性中。该应用程序成功运行,并且Switch小部件确实显示但单击它不会更改它,就好像它不起作用。我尝试在构建方法中创建相同的小部件,并且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),
        ),
      ),
    );
  }
}
dart widget flutter
1个回答
1
投票

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

它失败的原因是因为当值改变时(当你调用setState时)需要重建小部件,但这不是因为当调用build()时,之前(在initState中)创建的小部件被重用。

  @override
  Widget build(BuildContext context) {
    List<Widget> widgetList = [];
    Switch myWidget = new Switch(value: _value, onChanged: _onClicked);
    widgetList.add(myWidget);

    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),
        ),
      ),
    );
  }
© www.soinside.com 2019 - 2024. All rights reserved.