微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Flutter 中从 StatelessWidget 调用 StatefulWidget 的函数

如何解决在 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 举报,一经查实,本站将立刻删除。