Flutter 颤振触发父控件中的一个函数
假设我在这个小部件中有一个小部件“mySonWidget”,我有一个函数“updateIconColor”,我想从“mySonWidget”之父那里调用这个函数 我做了一些类似的回调,但这不是相同的情况。 我看到其他小部件也在控制器上做类似的事情,但我不知道如何创建自定义控制器 我怎么做? 帮助Flutter 颤振触发父控件中的一个函数,flutter,dart,Flutter,Dart,假设我在这个小部件中有一个小部件“mySonWidget”,我有一个函数“updateIconColor”,我想从“mySonWidget”之父那里调用这个函数 我做了一些类似的回调,但这不是相同的情况。 我看到其他小部件也在控制器上做类似的事情,但我不知道如何创建自定义控制器 我怎么做? 帮助 类mySonWidget扩展StatefulWidget{ @凌驾 _mySonWidgetState createState()=>\u mySonWidgetState(); } 类_mySonWi
类mySonWidget扩展StatefulWidget{
@凌驾
_mySonWidgetState createState()=>\u mySonWidgetState();
}
类_mySonWidgetState扩展状态{
var_iconColor=Colors.red[500];
void updateIconColor(){
设置状态(){
print('调用了updateIconColor');
_iconColor=Colors.green;
});
}
@凌驾
小部件构建(构建上下文){
返回容器(
填充:边缘集。全部(0),
孩子:我的钮扣(
图标:(图标(Icons.star)),
颜色:_i颜色,
按下:(){},
),
);
}
}
父亲的例子:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData.dark().copyWith(scaffoldBackgroundColor: darkBlue),
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Column(children: <Widget>[
mySonWidget(),
FlatButton(
onPressed: () {
/*..Call Function inside mySonWidget (updateIconColor) ..*/
},
child: Text(
"Change Color",
),
),
]),
),
);
}
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
主题:ThemeData.dark().copyWith(脚手架背景颜色:深蓝色),
debugShowCheckedModeBanner:false,
家:脚手架(
正文:列(子项:[
mySonWidget(),
扁平按钮(
已按下:(){
/*…调用mySonWidget(updateIconColor)内的函数*/
},
子:文本(
“换颜色”,
),
),
]),
),
);
}
}
您可以复制粘贴运行下面的完整代码您可以使用
GlobalKey
可以使用\u键.currentState
调用updateIconColor()
代码片段
GlobalKey _key = GlobalKey();
...
mySonWidget(key: _key),
FlatButton(
onPressed: () {
final _mySonWidgetState _state = _key.currentState;
_state.updateIconColor();
},
...
class mySonWidget extends StatefulWidget {
mySonWidget({Key key}) : super(key: key);
工作演示
完整代码
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
GlobalKey _key = GlobalKey();
@override
Widget build(BuildContext context) {
return MaterialApp(
//theme: ThemeData.dark().copyWith(scaffoldBackgroundColor: darkBlue),
debugShowCheckedModeBanner: false,
home: SafeArea(
child: Scaffold(
body: Column(children: <Widget>[
mySonWidget(key: _key),
FlatButton(
onPressed: () {
final _mySonWidgetState _state = _key.currentState;
_state.updateIconColor();
},
child: Text(
"Change Color",
),
),
]),
),
),
);
}
}
class mySonWidget extends StatefulWidget {
mySonWidget({Key key}) : super(key: key);
@override
_mySonWidgetState createState() => _mySonWidgetState();
}
class _mySonWidgetState extends State<mySonWidget> {
var _iconColor = Colors.red[500];
void updateIconColor() {
setState(() {
print('updateIconColor was called');
_iconColor = Colors.green;
});
}
@override
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.all(0),
child: IconButton(
icon: (Icon(Icons.star)),
color: _iconColor,
onPressed: () {},
),
);
}
}
导入“包装:颤振/材料.省道”;
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
GlobalKey _key=GlobalKey();
@凌驾
小部件构建(构建上下文){
返回材料PP(
//主题:ThemeData.dark().copyWith(脚手架背景颜色:深蓝色),
debugShowCheckedModeBanner:false,
家:安全区(
孩子:脚手架(
正文:列(子项:[
mySonWidget(键:_键),
扁平按钮(
已按下:(){
final _mySonWidgetState _state=_key.currentState;
_state.updateIconColor();
},
子:文本(
“换颜色”,
),
),
]),
),
),
);
}
}
类mySonWidget扩展了StatefulWidget{
mySonWidget({Key}):超级(Key:Key);
@凌驾
_mySonWidgetState createState()=>\u mySonWidgetState();
}
类_mySonWidgetState扩展状态{
var_iconColor=Colors.red[500];
void updateIconColor(){
设置状态(){
print('调用了updateIconColor');
_iconColor=Colors.green;
});
}
@凌驾
小部件构建(构建上下文){
返回容器(
填充:边缘集。全部(0),
孩子:我的钮扣(
图标:(图标(Icons.star)),
颜色:_i颜色,
按下:(){},
),
);
}
}
您可以复制粘贴运行下面的完整代码您可以使用
GlobalKey
可以使用\u键.currentState
调用updateIconColor()
代码片段
GlobalKey _key = GlobalKey();
...
mySonWidget(key: _key),
FlatButton(
onPressed: () {
final _mySonWidgetState _state = _key.currentState;
_state.updateIconColor();
},
...
class mySonWidget extends StatefulWidget {
mySonWidget({Key key}) : super(key: key);
工作演示
完整代码
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
GlobalKey _key = GlobalKey();
@override
Widget build(BuildContext context) {
return MaterialApp(
//theme: ThemeData.dark().copyWith(scaffoldBackgroundColor: darkBlue),
debugShowCheckedModeBanner: false,
home: SafeArea(
child: Scaffold(
body: Column(children: <Widget>[
mySonWidget(key: _key),
FlatButton(
onPressed: () {
final _mySonWidgetState _state = _key.currentState;
_state.updateIconColor();
},
child: Text(
"Change Color",
),
),
]),
),
),
);
}
}
class mySonWidget extends StatefulWidget {
mySonWidget({Key key}) : super(key: key);
@override
_mySonWidgetState createState() => _mySonWidgetState();
}
class _mySonWidgetState extends State<mySonWidget> {
var _iconColor = Colors.red[500];
void updateIconColor() {
setState(() {
print('updateIconColor was called');
_iconColor = Colors.green;
});
}
@override
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.all(0),
child: IconButton(
icon: (Icon(Icons.star)),
color: _iconColor,
onPressed: () {},
),
);
}
}
导入“包装:颤振/材料.省道”;
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
GlobalKey _key=GlobalKey();
@凌驾
小部件构建(构建上下文){
返回材料PP(
//主题:ThemeData.dark().copyWith(脚手架背景颜色:深蓝色),
debugShowCheckedModeBanner:false,
家:安全区(
孩子:脚手架(
正文:列(子项:[
mySonWidget(键:_键),
扁平按钮(
已按下:(){
final _mySonWidgetState _state=_key.currentState;
_state.updateIconColor();
},
子:文本(
“换颜色”,
),
),
]),
),
),
);
}
}
类mySonWidget扩展了StatefulWidget{
mySonWidget({Key}):超级(Key:Key);
@凌驾
_mySonWidgetState createState()=>\u mySonWidgetState();
}
类_mySonWidgetState扩展状态{
var_iconColor=Colors.red[500];
void updateIconColor(){
设置状态(){
print('调用了updateIconColor');
_iconColor=Colors.green;
});
}
@凌驾
小部件构建(构建上下文){
返回容器(
填充:边缘集。全部(0),
孩子:我的钮扣(
图标:(图标(Icons.star)),
颜色:_i颜色,
按下:(){},
),
);
}
}
当我看到emulator时,我就会知道它是您;)是的chuhunghan你的代码很有效。我唯一可以添加的是,如果您的小部件父子在不同的文件(.dart文件)中,那么代码中的“\u mySonWidgetState”是私有的,因此您需要使用mySonWidgetState才能执行强制转换:final mySonWidgetState _state=\u key.currentState;就这些。谢谢当我看到模拟器时,我会知道是你;)是的chuhunghan你的代码很有效。我唯一可以添加的是,如果您的小部件父子在不同的文件(.dart文件)中,那么代码中的“\u mySonWidgetState”是私有的,因此您需要使用mySonWidgetState才能执行强制转换:final mySonWidgetState _state=\u key.currentState;就这些。谢谢你你应该把类名大写你应该把类名大写