如何解决在 Flutter 中从 StatelessWidget 调用 StatefulWidget 的函数
我想在 StatelessWidget 中的一个按钮被按下时从我的 StatefulWidget 调用一个函数。在下面的代码中,您可以看到我正在尝试做什么。我不太确定它是如何工作的,所以也许你可以帮助我。
StatelessWidget - 按钮应该从 StatefulWidget 调用函数
class HomeWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
child: Column(
children: [
SafeArea(child: Column(
children: [
Padding(
padding: EdgeInsets.all(10),child: ProgressButton.icon(iconedButtons: {not needed}
onpressed: addUser,state: ButtonState.idle),),],)),);
}
}
Statefulwidget - addUser() 应该被 StatelessWidget 调用
class HomeStateful extends StatefulWidget {
@override
_HomeStatefulState createState() => _HomeStatefulState();
}
class _HomeStatefulState extends State<HomeStateful> {
final firestoreInstance = FirebaseFirestore.instance;
CollectionReference users = FirebaseFirestore.instance.collection('users');
int _currentIndex = 0;
final List<Widget> _children = [
HomeWidget(),MessageWidget(),];
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,body: _children[_currentIndex],bottomNavigationBar: BottomNavigationBar(
currentIndex: _currentIndex,onTap: onTabTapped,items: [
BottomNavigationBarItem(
icon: Icon(Icons.home),title: Text("Home"),backgroundColor: Colors.blue,BottomNavigationBarItem(
icon: Icon(Icons.mail),title: Text("Nachrichten"),]),);
}
void onTabTapped(int index) {
setState(() {
_currentIndex = index;
});
}
void addUser() {
firestoreInstance.collection("users").add({
"vorname": prenameController,"nachname": nameController,"geburtstag": birthdayController,"adresse": adressController,"telefon": numberController,"id": 0
});
}
}
解决方法
你可以在无状态小部件中使用回调函数,就像这样
class HomeWidget extends StatelessWidget {
const HomeWidget({Key key,@required this.addUser}) : super(key: key);
/// If you want to pass any value back,then you can use something
/// like this
/// final Function(User user) addUser;
/// VoidCallback as name speaks its a empty fn.
final VoidCallback addUser; // ==> Here is the answer.
@override
Widget build(BuildContext context) {
return Container(
child: Column(
children: [
SafeArea(
child: Column(
children: [
Padding(
padding: EdgeInsets.all(10),child: RaisedButton(
onPressed: addUser,// Add User fun here
)),],)),),);
}
}
在有状态/父小部件中。
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final _list = <Widget>[
HomeWidget(addUser: addUser) // Wrong,You cannot access the addUser here.
];
final _childList = <Widget>[];// But you can initialize here and add the HomeWidget in initState.
@override
void initState() {
super.initState();
_childList.addAll([
HomeWidget(addUser: addUser),HomeWidget(addUser: addUser),///... Other children
]);
}
void addUser() {
// Do Somethign
}
@override
Widget build(BuildContext context) {
return Column(
children: [
HomeWidget(addUser: addUser),);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。