Oi Charles,
Excelente iniciativa em criar a função de depósito e validar a entrada do usuário! 👍
Percebi que você está repetindo a lógica de leitura e validação do valor da operação em cada função (deposito, retirada, etc). 
Uma forma de otimizar seu código seria criar uma função genérica para essa tarefa, que recebe como parâmetro o tipo de operação e retorna o valor validado. 
Assim, você evita repetição de código e torna sua aplicação mais organizada.
Outro ponto é que você está usando double.parse(stdin.readLineSync().toString()). 
O toString() aqui é redundante, pois stdin.readLineSync() já retorna uma String?. 
Você pode usar diretamente double.tryParse(stdin.readLineSync()) que retorna null se a conversão falhar, evitando erros. 🤔
Além disso, você pode usar um do...while para garantir que o usuário digite uma operação válida pelo menos uma vez, em vez de usar um while com uma variável opcaoCorreta.
Aqui está um exemplo de como você pode refatorar seu código:
import 'dart:io';
void main() {
  List<String> listaOperacao = ['deposito', 'retirada', 'transferencia', 'pagamento'];
  String? funcaoDaOperacao;
  double valorDaOperacao = 0.0;
  double? lerValorOperacao() {
    print('Digite o valor da operação:');
    String? input = stdin.readLineSync();
    double? valor = double.tryParse(input ?? '');
    if (valor == null || valor.isNegative) {
      print('Valor inválido. Digite um valor positivo.');
      return null;
    }
    return valor;
  }
  void realizarOperacao(String operacao) {
    double? valor;
    do {
      valor = lerValorOperacao();
    } while (valor == null);
    valorDaOperacao = valor;
    print('Operação escolhida: $operacao, Valor: R\$$valorDaOperacao');
  }
  do {
    print('Digite uma operação (${listaOperacao.join(', ')}):');
    funcaoDaOperacao = stdin.readLineSync();
    if (listaOperacao.contains(funcaoDaOperacao)) {
      switch (funcaoDaOperacao) {
        case 'pagamento':
          realizarOperacao('pagamento');
          break;
        case 'deposito':
          realizarOperacao('deposito');
          break;
        case 'retirada':
          realizarOperacao('retirada');
          break;
        case 'transferencia':
          realizarOperacao('transferencia');
          break;
      }
    } else {
      print('Operação inválida. Tente novamente.');
    }
  } while (!listaOperacao.contains(funcaoDaOperacao));
}
Para saber mais: Documentação oficial sobre tratamento de erros em Dart.
Continue praticando e explorando as funcionalidades do Dart! 💪