Что такое строки в языке дартс.

В Dart строка представляет собой упорядоченную последовательность значений UTF-16, заключенную либо в одинарные, либо в двойные
кавычки. Очень приятной особенностью языка является возможность объединения выражений в строки
с помощью ${expr} (сокращение для вызова метода toString()).

// No differences between s and t
var s = "Double quoted";
var t = 'Single quoted';
// Interpolate an integer into a string
var age = 25;
var myAge = "I am $age years old";
// Expressions need '{' and '}' preceeded by $
var test = "${25.abs()}"
// This is redundant, don't do it because ${} already calls toString()
var redundant = "${25.toString()}";

Строка может быть однострочной или многострочной. Однострочные строки показаны выше с использованием одинарных или
двойных кавычек, а многострочные строки записываются с использованием тройных кавычек. Они могут быть полезны, когда
вы хотите красиво отформатировать код, чтобы сделать его более читабельным.

// Very useful for SQL queries, for example
var query = """
SELECT name, surname, age
FROM people
WHERE age >= 18
ORDER BY name DESC
""";

В Dart нет типа char, представляющего один символ, потому что есть только строки. Если
вы хотите получить доступ к определенному символу строки, вы должны использовать оператор []:

final name = "Alberto";
print(name[0]); // prints "A"
print(name[2]); // prints "b";

Возвращаемое значение name[0] — это строка, длина которой равна 1. Мы рекомендуем вам посетить 2
онлайн-документацию Dart о строках, которая очень полезна и полна примеров.

var s = 'I am ' + name + ' and I am ' + (23).toString() + ' y.o.';

Вы можете очень легко объединять строки с помощью оператора + классическим способом, поддерживаемым большинством языков программирования. В официальном руководстве Dart 3
предлагается использовать интерполяцию
для составления строк, которая короче и чище:

var s = 'I am $name. I am ${25} years old';

Если строка длиннее одной строки, избегайте оператора + и предпочитайте простой разрыв строки.
Это просто то, что Dart рекомендует из соображений стиля, это не влияет на производительность
вообще. Старайтесь максимально соответствовать правилам языка!

// Ok
var s = 'I am going to the'
'second line';
// Still ok but '+' can be omitted
var s = 'I am going to the' +
'second line';

Поскольку строки неизменяемы, выполнение слишком большого количества конкатенаций с помощью оператора + может оказаться
неэффективным. В таких случаях было бы лучше, если бы вы использовали StringBuffer, который эффективно объединяет
строки. Например:

var value = "";
for(var i = 0; i < 900000; ++i) {
value += "$i ";
}

Каждый раз, когда вызывается оператор +, value присваивается новый экземпляр, который объединяет старое
значение и новое. Другими словами, этот код создает 900 000 раз новый объект String,
по одному на каждую итерацию, и это совсем не оптимально. Вот как это сделать:

var buffer = StringBuffer();
for(var i = 0; i < 900000; ++i)
buffer.write("$i ");
var value = buffer.toString();

Это гораздо лучше, потому что StringBuffer не создает новую строку внутри каждой итерации;
строка создается только один раз в момент вызова toString(). Когда вам нужно
выполнять длинные циклы, управляющие строками, избегайте использования оператора + и предпочитайте буфер. Тот же самый класс
также можно найти, например, в Java и C#.