如果在initState()中创建,则Flutter Switch小部件不起作用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果在initState()中创建,则Flutter Switch小部件不起作用相关的知识,希望对你有一定的参考价值。
我正在尝试创建一个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),
),
),
);
}
}
答案
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),
),
),
);
}
以上是关于如果在initState()中创建,则Flutter Switch小部件不起作用的主要内容,如果未能解决你的问题,请参考以下文章