A method can comprise providing an ink comprising reactants, a complexing agent, and a solvent, depositing the ink onto a substrate to form a wet film, drying the wet film to form a precursor layer, and annealing the precursor layer to form a perovskite film. The reactants can comprise a first and a second cation, a first metal, and a first and a second anion, wherein the first and second cations are different from each other, and the first and second anions are different from each other. The complexing agent can comprise a heterocyclic donor material. The perovskite film can comprise a mixed-cation mixed-halide perovskite material, and less than 5% by mass of the complexing agent. The perovskite film can also be formed using a one-step process.