我是flutter
的初学者。
我的主页分为2个自定义小部件,top
小部件和page
小部件。我有一个带几个按钮的抽屉,用于更改page
小部件的内容。
我关注了this tutorial,并尝试按一下按钮交换小部件。
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
var currentpage = 'landing';
Widget pageWidget;
switch (currentpage) {
case 'landing':
pageWidget = new Landing();
break;
case 'visitors':
pageWidget = new Visitors();
break;
default:
}
return Scaffold(
body:new Container(
child: Container(
child: Column(
children: <Widget>[
Header(), ///<-- widget declared in separated .dart file
pageWidget
],
)
)
drawer: Drawer(
child: ListView(
children: <Widget>[
DrawerHeader(
child: Text(
"UserN3",
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
color: Colors.black54),
),
),
new GestureDetector(
onTap: (){
print("landing");
Future.delayed(Duration.zero,(){
setState(() {
currentpage = 'landing';
});
});
},
child: new Text("landing"),
),
new GestureDetector(
onTap: (){
print("visitors");
Future.delayed(Duration.zero,(){
setState(() {
currentpage = 'visitors';
});
});
},
child: new Text("Visitors"),
),
],
),
),
);
}
要点是:
我的构建中有switch case
,它将根据pageWidget
相应地更改currentpage
,Future.delayed()
将通过抽屉中的按钮进行更改。
但是继续出现相同的错误:
引发了另一个异常:锁定小部件树时调用setState()或markNeedsBuild()。
如您所见,我基于this suggestion添加了drawer
,但错误仍然存在。
经过一些研究,我感觉到它与setState()
与flutter
的处理方式有关,但我不确定如何处理。
很明显,我仍然没有从build
和state
的角度来了解public VideoPlayer vp;
public void seturl(string filetoplay)
{
vp.url = "file://"+filetoplay;
vp.play();
}
的工作方式。
似乎是问题所在,我该如何解决?
答案 0 :(得分:0)
您应该在currentPage
方法之外声明build
变量,因为每次调用setState
时,都会再次调用build
方法,并且变量不会更改。
所以移动这个:
Widget build(BuildContext context) {
var currentpage = 'landing';
对此:
var currentpage = 'landing';
Widget build(BuildContext context) {