Учебное пособие по Flutter: вызов методов и извлечение значений — подробное руководство

Во Flutter вызов методов и извлечение значений играют решающую роль в создании надежных и интерактивных приложений. В этом уроке мы рассмотрим различные методы и приемы вызова значений из методов Flutter с использованием языка программирования Dart. Мы предоставим примеры кода для каждого метода, чтобы помочь вам лучше понять концепцию.

Содержание:

  1. Прямой вызов метода

  2. Использование ключевого слова «await»

  3. Передача функций обратного вызова

  4. Использование виджета FutureBuilder

  5. Получение значений с помощью StreamBuilder

  6. Использование ValueNotifier и ValueListenableBuilder

  7. Реализация шаблона поставщика

  8. Прямой вызов метода.
    Самый простой способ вызвать метод и извлечь его значение — это напрямую вызвать метод. Давайте рассмотрим простой пример:

String getName() {
  return 'John Doe';
}
void main() {
  String name = getName();
  print(name);  // Output: John Doe
}
  1. Использование ключевого слова «await».
    При работе с асинхронными методами вы можете использовать ключевое слово await, чтобы приостановить выполнение до тех пор, пока метод не вернет значение. Вот пример:
Future<int> fetchNumber() async {
  await Future.delayed(Duration(seconds: 2));
  return 42;
}
void main() async {
  int number = await fetchNumber();
  print(number);  // Output: 42
}
  1. Передача функций обратного вызова.
    Другой подход — передать функции обратного вызова в качестве параметров методам. Вызванный метод может затем вызвать функцию обратного вызова с желаемым значением. Рассмотрим следующий пример:
void performOperation(void Function(int) callback) {
  int result = 5 + 3;
  callback(result);
}
void main() {
  performOperation((result) {
    print(result);  // Output: 8
  });
}
  1. Использование виджета FutureBuilder.
    Во Flutter вы можете использовать виджет FutureBuilderдля обработки асинхронных операций и отображения результата, как только он станет доступен. Вот пример:
Future<String> fetchName() async {
  await Future.delayed(Duration(seconds: 2));
  return 'Jane Smith';
}
void main() {
  runApp(MaterialApp(
    home: FutureBuilder<String>(
      future: fetchName(),
      builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting) {
          return CircularProgressIndicator();
        } else {
          return Text(snapshot.data);  // Output: Jane Smith
        }
      },
    ),
  ));
}
  1. Получение значений с помощью StreamBuilder.
    Если вам необходимо постоянно обновлять значения в режиме реального времени, вы можете использовать виджет StreamBuilder. Это позволяет вам прослушивать поток данных и соответствующим образом обновлять пользовательский интерфейс. Вот пример:
Stream<int> numberStream() {
  return Stream.periodic(Duration(seconds: 1), (i) => i + 1);
}
void main() {
  runApp(MaterialApp(
    home: StreamBuilder<int>(
      stream: numberStream(),
      builder: (BuildContext context, AsyncSnapshot<int> snapshot) {
        if (snapshot.hasData) {
          return Text('Current number: ${snapshot.data}');
        } else {
          return CircularProgressIndicator();
        }
      },
    ),
  ));
}
  1. Использование ValueNotifier и ValueListenableBuilder:
    ValueNotifierи ValueListenableBuilderполезны, когда вы хотите прослушивать изменения значения и соответствующим образом обновлять пользовательский интерфейс. Вот пример:
ValueNotifier<int> counter = ValueNotifier<int>(0);
void main() {
  runApp(MaterialApp(
    home: ValueListenableBuilder(
      valueListenable: counter,
      builder: (BuildContext context, int value, Widget child) {
        return Column(
          children: [
            Text('Counter: $value'),
            ElevatedButton(
              onPressed: () => counter.value += 1,
              child: Text('Increment'),
            ),
          ],
        );
      },
    ),
  ));
}
  1. Реализация шаблона поставщика:
    Для более сложного управления состоянием можно использовать пакет Provider. Это позволяет вам обмениваться значениями и получать к ним доступ в разных частях приложения. Вот упрощенный пример: