Dynamic listener pass in for tap

Hi,

I’m relatively new to lua and corona and I’m struggling to find anything on this top:

I want to have multiple buttons on a screen, all with tap events, that do various things, but from the tutorial it looks like I would have to write a listener per action and an assignment per action.

I’m trying to streamline that by making a the assignment a function, with a passable action and listener string:

Please excuse the code, as I said I’m new, I’m sure it has other issues:

This is inside object_view.lua

local composer = require('composer') local OV = {} local showHelp = {} local helpBtn local function showTitle() local titleB = display.newText('B', (display.contentWidth/2-80), 148, native.systemFont, 75) titleB:setTextColor(convertColor(249), convertColor(139), convertColor(253)) local titleO = display.newText('O', (display.contentWidth/2-35), 165, native.systemFont, 60) titleO:setTextColor(convertColor(249), convertColor(139), convertColor(253)) local titleUnce = display.newText('unce', (display.contentWidth/2)+52, 152, native.systemFont, 60) titleUnce:setTextColor(convertColor(249), convertColor(139), convertColor(253)) local title = display.newGroup(titleB, titleO, titleUnce) return title end OV.showTitle = showTitle local function showPlayButton() local playBtn = display.newText('Start', display.contentWidth/2, 248, native.systemFontBold) playBtn:setTextColor(convertColor(249), convertColor(139), convertColor(253)) return playBtn end OV.showPlayButton = showPlayButton local function showHelpButton() helpBtn = display.newText('Instructions', display.contentWidth/2, 270, native.systemFontBold) helpBtn:setTextColor(convertColor(249), convertColor(139), convertColor(253)) toggleSceen('show', 'showHelp') return helpBtn; end OV.showHelpButton = showHelpButton local function showBackButton() BackBtn = display.newText('Back', display.contentWidth/2, 248, native.systemFontBold) BackBtn:setTextColor(convertColor(249), convertColor(139), convertColor(253)) -- toggleBack('show') return BackBtn; end OV.showBackButton = showBackButton function showHelp:tap(event) composer.gotoScene('scenes.help') end function toggleSceen(action, listener) if(action == 'show') then helpBtn:addEventListener('tap', \_G[listener]) else helpBtn:removeEventListener('tap', \_G[listener]) end end return OV

This is inside menu.lua

local composer = require('composer') local OV = require('general.object\_view') local scene = composer.newScene() -- ----------------------------------------------------------------------------------------------------------------- -- All code outside of the listener functions will only be executed ONCE unless 'composer.removeScene()' is called. -- ----------------------------------------------------------------------------------------------------------------- -- local forward references should go here -- ------------------------------------------------------------------------------- -- 'scene:create()' function scene:create(event) local sceneGroup = self.view local bg = display.newRect(0, 0, display.pixelWidth, display.pixelHeight) bg.fill = paint bg:setFillColor(convertColor(52), convertColor(45), convertColor(46)) sceneGroup:insert(bg) sceneGroup:insert(OV.showTitle()) sceneGroup:insert(OV.showPlayButton()) sceneGroup:insert(OV.showHelpButton()) -- Initialize the scene here. -- Example: add display objects to 'sceneGroup', add touch listeners, etc. end -- 'scene:show()' function scene:show(event) local sceneGroup = self.view local phase = event.phase if (phase == 'will') then -- Called when the scene is still off screen (but is about to come on screen). elseif (phase == 'did') then -- Called when the scene is now on screen. -- Insert code here to make the scene come alive. -- Example: start timers, begin animation, play audio, etc. end end -- 'scene:hide()' function scene:hide(event) local sceneGroup = self.view local phase = event.phase if (phase == 'will') then -- Called when the scene is on screen (but is about to go off screen). -- Insert code here to 'pause' the scene. -- Example: stop timers, stop animation, stop audio, etc. elseif (phase == 'did') then -- Called immediately after scene goes off screen. end end -- 'scene:destroy()' function scene:destroy(event) local sceneGroup = self.view -- Called prior to the removal of scene's view ('sceneGroup'). -- Insert code here to clean up the scene. -- Example: remove display objects, save state, etc. end -- ------------------------------------------------------------------------------- -- Listener setup scene:addEventListener('create', scene) scene:addEventListener('show', scene) scene:addEventListener('hide', scene) scene:addEventListener('destroy', scene) -- ------------------------------------------------------------------------------- return scene

When I run this, I’m getting an error of:

addEventListener: listener cannot be nil: nil stack traceback: [C]: in function 'error' ?: in function 'getOrCreateTable' ?: in function 'addEventListener' ?: in function 'addEventListener' C:\webserver\personal\android\_dev\bouncev2\general\object\_view.lua:14: in function 'toggleHelp' C:\webserver\personal\android\_dev\bouncev2\general\object\_view.lua:47: in function 'showHelpButton' C:\webserver\personal\android\_dev\bouncev2\scenes\menu.lua:25: in function \<C:\webserver\personal\android\_dev\bouncev2\scenes\menu.lua:14\> ?: in function 'dispatchEvent' ?: in function 'gotoScene' C:\webserver\personal\android\_dev\bouncev2\main.lua:45: in main chunk

The _G[] was something I saw to pull a function name from the global namespace, though I have my doubts about its validity here.

Thanks in advance.