O dynamic é semelhante ao var a única diferença está no comportamento, caso vc queira modificar o valor da variável, um exemplo deixa tudo mais claro.
Com var:
void main() {
var abc = 'abc'; // O dart sinaliza que a variável *abc* vai ser do tipo **String**
abc = 979899; // Isso gera um erro já que *abc* foi sinalizado como **String** e não **int**
}
Com dynamic:
void main() {
dynamic abc = 'abc';
abc = 979899;
}
No caso com o dynamic o erro não ocorre, já que ele permite esse tipo de atribuição.