首页 > 解决方案 > 将 Tap/Pressed 事件传输到子小部件 Flutter

问题描述

我使用bottomNavigation,但我需要在其中的一页中有一个工厂。我的问题是我找不到将点击事件从 fab 传输到 bottomNavigation 页面(在本例中为 BlablaScreen)的解决方案。我不明白我是否必须使用 Function, VoiceCallBack ?显然我们不必在底部导航中使用很多脚手架,只需一个主脚手架。所以我必须在主脚手架中使用这个工厂,然后将事件从工厂传播到孩子。谢谢

我的代码:

    class MainBoardState extends State<MainBoard> {
  int _selectedIndex = 0;
  bool fabTapped = false;
  bool fabVisible = true;
  //VoidCallback _fabTapped;

 
  _setFabVisible(bool value){
   setState(() {
     fabVisible = value;
   });
  }

  Widget getPage(int indexBottomNavigation){
    switch(indexBottomNavigation){
      case 0 :
        return HomeScreen();

      case 1:
        return TotoScreen();
      case 2:
        return BlablaScreen(fabTapped:StringValue, fabVisible: _setFabVisible);
      default:
        return HomeScreen();
    }
  }

  void _onItemTap(int index) {
    setState(() {
      _selectedIndex = index;
    });
  }

  void handleClick(String value) {
    switch (value) {
      case 'Logout':
        BlocProvider.of<AuthBloc>(context).logOut();
        Navigator.pushReplacement(
            context, MaterialPageRoute(builder: (context) => Login()));
        break;
      case 'Settings':
        break;
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
       /** appBar: _selectedIndex == 0
            ? AppBar(
                actions: [
                  PopupMenuButton<String>(
                    icon: Icon(Icons.person),
                    onSelected: handleClick,
                    itemBuilder: (BuildContext context) {
                      return {'Logout', 'Account'}.map((String choice) {
                        return PopupMenuItem<String>(
                          value: choice,
                          child: Text(choice),
                        );
                      }).toList();
                    },
                  ),
                ],
              )
            : null,**/
        floatingActionButton: _selectedIndex == 2 ? fabVisible ? FloatingActionButton(
            onPressed: () => ,//<-- here I don't know
          child: Icon(Icons.edit),
        ) :null : null,
        bottomNavigationBar: BottomNavigationBar(
            items: const <BottomNavigationBarItem>[
              BottomNavigationBarItem(
                icon: Icon(Icons.home),
                label: 'Home',
              ),
              BottomNavigationBarItem(
                icon: Icon(Icons.person),
                label: 'Experiences',
              ),
              BottomNavigationBarItem(
                icon: Icon(Icons.settings),
                label: 'Blabla',
              ),
              /**BottomNavigationBarItem(
                  icon: Icon(Icons.calendar_today),
                  label: 'Calendar',
                  backgroundColor: Colors.lightBlue,
                  ),**/
            ],
            type: BottomNavigationBarType.shifting,
            currentIndex: _selectedIndex,
            selectedItemColor: Theme.of(context).primaryColor,
            unselectedItemColor: Colors.grey,
            iconSize: 20,
            onTap: _onItemTap,
            elevation: 5),
        body: InheritedUser(
            user: widget.user, child: getPage(_selectedIndex)));
  }

并且 BlablaPage 必须接收 fab 点击事件(一个 voidCallBack ?一个函数?):

class BlablaScreen extends StatefulWidget {
  final VoidCallback fabTapped;
  final Function fabVisible;
  BlablaScreen({required this.fabTapped,required this.fabVisible});
  @override
  State<StatefulWidget> createState() => BlablaScreenState(fabTapped);
}

class BlablaScreenState extends State<BlablaScreen> {
  VoidCallback fabTapped;
  FeedScreenState(this.fabTapped){
      fabTapped={
        print('show Blabla')
      } as VoidCallback;
  }

  @override
  void initState() {
    super.initState();
    BlocProvider.of<FeedBloc>(context).getBlabla();

  }

标签: flutter

解决方案


推荐阅读