Flutter 我可以使用setState更改小部件的主体吗?
我的申请已经被批准了 但我只想改变脚手架的主体 通常我使用Flutter 我可以使用setState更改小部件的主体吗?,flutter,dart,Flutter,Dart,我的申请已经被批准了 但我只想改变脚手架的主体 通常我使用setState()来更改状态,但在这种情况下,我如何使用setState()或使用其他方法 import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { retu
setState()
来更改状态,但在这种情况下,我如何使用setState()
或使用其他方法
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
void onTapped() {
print ("tapped");
// I want to change only body of Scaffold like this
// body: new Text("new body");
};
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body:
GestureDetector(
onTap: () => onTapped(),
child:Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
],
),
),
),
);
}
}
导入“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
主题:主题数据(
主样本:颜色。蓝色,
),
主页:MyHomePage(标题:“颤振演示主页”),
);
}
}
类MyHomePage扩展StatefulWidget{
MyHomePage({Key,this.title}):超级(Key:Key);
最后的字符串标题;
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
void onTapped(){
打印(“抽头”);
//我只想换一个这样的脚手架
//正文:新案文(“新正文”);
};
类_MyHomePageState扩展状态{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(widget.title),
),
正文:
手势检测器(
onTap:()=>onTapped(),
儿童:中心(
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
正文(
“您已经按了这么多次按钮:”,
),
],
),
),
),
);
}
}
您可以创建一个变量小部件\u scaffoldBody代码>以固定当前脚手架主体
为其设置初始值,然后在需要更改主体时调用setState
大概是这样的:
class _MyHomePageState extends State<MyHomePage> {
Widget _scaffoldBody;
@override
void initState(){
// Initialize it with the first body you want visible.
_scaffoldBody = GestureDetector(
onTap: () => onTapped(),
child:Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
],
),
),
);
}
// Note: move the onTapped method inside the state so you can call setState;
void onTapped()
// Call setState changing the body
setState((){
_scaffoldBody = Text("new body");
});
};
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: _scaffoldBody,
);
}
}
class\u MyHomePageState扩展状态{
小部件(脚手架主体),;
@凌驾
void initState(){
//使用第一个要显示的实体初始化它。
_脚手架主体=手势检测器(
onTap:()=>onTapped(),
儿童:中心(
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
正文(
“您已经按了这么多次按钮:”,
),
],
),
),
);
}
//注意:将onTapped方法移到state中,这样就可以调用setState;
void onTapped()
//调用setState更改主体
设置状态(){
_脚手架主体=文本(“新主体”);
});
};
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(widget.title),
),
车身:_脚手架车身,
);
}
}
如果您只想在scaffold主体内设置state,请将主体设置为有状态小部件,并在该小部件内调用setState。您可以通过扩展无状态小部件或有状态小部件来定义自己的无状态和有状态小部件。将特定事物定义为它自己的小部件,而不仅仅是返回小部件的方法,这是非常有用的,因为颤振是如何划分重建过程的。如果scaffold的主体是它自己的小部件,那么当您调用setState时,只会重建该小部件。如果你按照另一个答案的建议去做,你将重建我的主页,其中包括脚手架。另一方面,如果定义一个作用域较小的有状态小部件,然后在该小部件内调用setState(),则只会重建作用域较小的小部件
例如:
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatelessWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
Widget build(BuildContext context) {
print('scaffold rebuilt');
return Scaffold(
appBar: AppBar(
title: Text(title),
),
body: ScaffoldBody(),
);
}
}
class ScaffoldBody extends StatefulWidget {
@override
_ScaffoldBodyState createState() => _ScaffoldBodyState();
}
class _ScaffoldBodyState extends State<ScaffoldBody> {
int timesTapped = 0;
void onTapped() {
setState(() {
timesTapped++;
});
}
@override
Widget build(BuildContext context) {
print('scaffold body rebuilt');
return GestureDetector(
onTap: onTapped,
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times: $timesTapped',
),
],
),
),
);
}
}
导入“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
主题:主题数据(
主样本:颜色。蓝色,
),
主页:MyHomePage(标题:“颤振演示主页”),
);
}
}
类MyHomePage扩展了无状态小部件{
MyHomePage({Key,this.title}):超级(Key:Key);
最后的字符串标题;
@凌驾
小部件构建(构建上下文){
打印(“脚手架重建”);
返回脚手架(
appBar:appBar(
标题:文本(标题),
),
主体:脚手架主体(),
);
}
}
类ScaffoldBody扩展StatefulWidget{
@凌驾
_ScaffoldBodyState createState()=>_ScaffoldBodyState();
}
类_ScaffoldBodyState扩展状态{
int=0;
void onTapped(){
设置状态(){
时间点++;
});
}
@凌驾
小部件构建(构建上下文){
打印(“脚手架主体重建”);
返回手势检测器(
onTap:onTapped,
儿童:中心(
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
正文(
“您已经按了这么多次按钮:$timesTapped”,
),
],
),
),
);
}
}
嘿,白熊!我对你的问题标题做了一点修改,我认为这样会使它更容易被其他人搜索,更通用,因为它适用于任何小部件的任何子部件?希望你也喜欢,祝你好运!嘿@George,我想你需要修正你对问题标题的编辑。我不认为“改变我改变…”是你想说的。我明白了,我理解。对于这种情况,制作另一个scaffold类是更好的主意。非常感谢您的精彩解释。这个选项真的更好,谢谢您的反馈。谢谢您,这也是非常有帮助的回答