Evans was born in Cheadle, Greater Manchester[2] and joined Manchester City at the age of six.[3] After several seasons in Manchester City's academy, Evans first came to prominence with several appearances on the bench for City during the 2012–13 season, although he was ultimately not given a debut for the senior team. In the following season, Evans began playing for the Elite Development Squad before being loaned to Crewe Alexandra at the end of October.[4] Within a week he was given his first senior cap, being named in the starting line-up for Crewe's home league game against Bradford City,[5] against whom he played a full 90 minutes. Evans' first goal for Crewe Alexandra came on 23 November against local rivals Port Vale.[6]
On 30 January 2015, he joined Scunthorpe United on loan until the end of the season.[7] Evans made 16 appearances during his loan spell, scoring once. On 22 September 2015, Evans made his First Team debut for Manchester City when he came on as a substitute during a 4–1 win against Sunderland in the League Cup.[8] In doing so, he became the second Manchester City player to represent the club at all levels from under-8s right through to the senior team, after Chris Chantler.
On 20 October 2015, Evans joined League One club Walsall on a one-month loan deal. He made his Walsall debut on the same day against Barnsley and scored the opening goal in a 0–2 away win.[9] On 24 November 2015, after "playing week in, week out", he extended his loan at Walsall until 9 January 2016[10] and was then extended again until 26 January 2016, the maximum allowed time for an emergency loan deal.[11] On 16 January 2016 he was recalled by parent club Manchester City as an offer had been made for a permanent move away from the club.
Reading
On 19 January 2016, Evans joined Championship club Reading on a three-and-a-half-year deal until 2019.[12] Evans scored his first goal for the club in a 1–1 draw with Derby County on 1 October 2016.[13]
Derby County
On 31 July 2018, Evans joined Championship club Derby County for an undisclosed fee, believed to be around £1m, on a 3-year deal[14] He signed a contract extension in August 2020 to take him through until the summer of 2022.[15]
Milwall
On 1 February 2021, Evans joined Championship club Millwall for an undisclosed fee.[16] He scored his first goal for Millwall, a late equaliser, in a 1-1 draw against Luton Town on 23 February 2021.[17]
Wrexham
In September 2023 Evans joined EFL League Two club Wrexham on a two-year contract.[18] On July 1, 2024, following Wrexham's promotion to EFL League One, Evans signed a two-year extension to stay with the club.[19]