【问题标题】:Flutter Switch widget does not work if created inside initState()如果在 initState() 中创建 Flutter Switch 小部件将不起作用
【发布时间】:2018-08-30 09:01:56
【问题描述】:

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

我在 _onClicked 中添加了一些 cmets,这些 cmets 已分配给 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),
        ),
      ),
    );
  }
}

【问题讨论】:

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

标签: dart widget flutter


【解决方案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),
        ),
      ),
    );
  }

【讨论】:

  • 感谢您的澄清。那么初始化一个 Switch 或几个 Switch 小部件并克服这个问题的最佳方法是什么?为创建的 Switch 设置键,然后在 _onClicked 上更新列表的适当值是否是一种好习惯?
  • 不确定是什么问题。只需使用与 initState 相同的代码,但仅从 build 执行,方法是直接将其移动到 build 或仅移动到 build 调用的方法。
  • 将 initState 代码移动到 build 将使新的 Switch 在每次状态更改时添加到列表中。这就是为什么我需要某种初始化方式。如果有帮助,我想要实现的是在运行时添加和删除开关。
  • 抱歉,忘记更新那部分了。请参阅我添加到构建的第一行。看来您仍然坚持在 build() 之外构建小部件的想法。你不应该那样做。
  • 感谢您的说明。因此,如果我需要在运行时添加另一个 Switch 小部件,我将需要添加一个计数器,每次用户添加新开关时都会增加一个计数器,然后循环并在 build() 本身内构建所有必要的 Switch。跨度>
猜你喜欢
  • 2018-12-25
  • 2019-01-28
  • 1970-01-01
  • 2021-10-25
  • 2021-10-07
  • 1970-01-01
  • 2019-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多