Coming from Dart 1, there’s two major developer-facing changes, the largest of which is a stronger type system, including runtime checks to help catch errors that would arise from mismatched or incorrectly labeled types. This type system, originally called “strong mode”, has long been the default in Flutter. The other is an interesting quality-of-life change for Flutter developers, which allows creating an instance of a class without the “new” keyword. The goal of this change is to make Flutter code more readable, less clunky, and easier to type, but the principle applies to all Dart code.
The complete list of changes has all the details.
This all reminds me of C#’s introduction. At the time it felt like Microsoft essentially recreating Java, with a bunch of technical issues fixed. But today C# has grown and evolved into a much different language. Maybe Dart will go through a similar evolution.