Latching Button Code not Working over NRF24L01

That is not a very detailed description of the problem. You should describe what the code actually does and how that differs from what you want.

I tried your code on a couple of Unos on mine. It kind of works. When I press the button the LED sometimes toggles but sometimes not. It is not consistent. Since you send every time through loop the receiver is getting spammed. I suggest not sending quite so often.

If you don't mind, here is how I would do it. This uses the state change detection method and example code from Robin2's simple rf24 tutorial. The push button toggles the mode and the mode is sent to the receiver. The transmitter code only sends when the mode changes. The blink without delay method is used for timing the button reads.

Transmitter with button:

// transmit the toggled button state 
// by c goulding aka groundfungus

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

const byte CE_PIN = 9;
const byte CSN_PIN = 10;
const byte buttonPin = 2;

const byte slaveAddress[5] = {'R', 'x', 'A', 'A', 'A'};

RF24 radio(CE_PIN, CSN_PIN); // Create a Radio

int dataToSend = 0;

unsigned long currentMillis;
unsigned long prevMillis;
unsigned long txIntervalMillis = 1000; // send once per second

void setup()
{

   Serial.begin(115200);
   Serial.println("SimpleTx Starting");

   pinMode(buttonPin, INPUT_PULLUP);

   radio.begin();
   //RF24_1MBPS, RF24_2MBPS, RF24_250KBPS
   radio.setDataRate( RF24_250KBPS );
   radio.setRetries(3, 5); // delay, count
   //radio.setChannel(10);
   //RF24_PA_MIN = 0,RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
   radio.setPALevel(RF24_PA_LOW);
   radio.openWritingPipe(slaveAddress);
}

//====================

void loop()
{
   static bool mode = 0;
   static bool lastButtonState = HIGH;
   static unsigned long timer = 0;
   unsigned long interval = 50;
   if (millis() - timer >= interval)
   {
      timer = millis();
      bool buttonState = digitalRead(buttonPin);
      if (buttonState != lastButtonState)
      {
         if (buttonState == LOW)
         {
            mode = !mode;
            dataToSend = mode;
            send();
         }
         lastButtonState = buttonState;
      }
   }
}

//====================

void send()
{
   bool rslt;
   rslt = radio.write( &dataToSend, sizeof(dataToSend) );
   // Always use sizeof() as it gives the size as the number of bytes.
   // For example if dataToSend was an int sizeof() would correctly return 2

   Serial.print("Data Sent ");
   Serial.print(dataToSend);
   if (rslt)
   {
      Serial.println("  Acknowledge received");
   }
   else
   {
      Serial.println("  Tx failed");
   }
}

Receiver code with LED:

// receive the toggled button state and light the LED
// by c goulding aka groundfungus

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

const byte CE_PIN = 9;
const byte CSN_PIN = 10;
const byte ledPin = 2;

const byte thisSlaveAddress[5] = {'R', 'x', 'A', 'A', 'A'};

RF24 radio(CE_PIN, CSN_PIN);

int recvData;

bool newData = false;

//===========

void setup()
{
   Serial.begin(115200);
   Serial.println("SimpleRx Starting");

   pinMode(ledPin, OUTPUT);
   
   radio.begin();
   radio.setDataRate( RF24_250KBPS );
   radio.setRetries(3, 5); // delay, count
   radio.setPALevel(RF24_PA_LOW);
   radio.openReadingPipe(1, thisSlaveAddress);
   radio.startListening();
}

//=============

void loop()
{
   getData();
   showData();   
}

//==============

void getData()
{
   if ( radio.available() )
   {
      radio.read( &recvData, sizeof(recvData) );
      newData = true;
   }
}

void showData()
{
   if (newData == true)
   {
      Serial.print("Data received >> ");
      Serial.print("number = ");
      Serial.println(recvData);

      digitalWrite(ledPin, recvData); // light the LED (or not)
      newData = false;   
   }
}