Общие примеры кода
Функция пользовательского кода в FlutterFlow позволяет расширять возможности за счет доступа к сгенерированным классам и изменения глобальных переменных, таких как состояния приложения и темы FlutterFlow. В этом руководстве рассматриваются распространенные сценарии, в которых вы можете использовать пользовательский код для улучшения проекта, работая непосредственно с моделями данных и другими ресурсами в коде.
Пользовательские функции не могут импортировать новые файлы или пакеты за пределами стандартных импортов. Поэтому большинство предложений ниже, связанных с добавлением нового импорта, не будут работать в пользовательских функциях из-за этого ограничения. Однако они будут работать в пользовательских виджетах и пользовательских действиях.
Например, новая пользовательская функция обычно включает следующие пакеты и файлы. Изменения в коде пользовательской функции должны использовать только эти пакеты и файлы:
import 'dart:convert';
import 'dart:math' as math;
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:intl/intl.dart';
import 'package:timeago/timeago.dart' as timeago;
import 'lat_lng.dart';
import 'place.dart';
import 'uploaded_file.dart';
import '/backend/backend.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import '/backend/schema/structs/index.dart';
import '/backend/schema/enums/enums.dart';
import '/auth/firebase_auth/auth_util.dart';
Доступ к сгенерированным классам FlutterFlow
FlutterFlow генерирует полный код Flutter для вас по мере создания приложений на его платформе. Часть этого кода включает пользовательские классы, предназначенные для упрощения распространенных задач и инкапсуляции повторно используемых свойств или логики.
Например:
- Виджеты кнопок: FlutterFlow предоставляет пользовательские классы кнопок, такие как
FFButton, которые имеют встроенное оформление и поведение. - Google Places: Класс
FFPlaceинкапсулирует свойства места Google, такие как название, адрес и координаты. - Загрузка файлов: Класс
FFUploadedFileпредставляет файлы, загруженные в ваше приложение, инкапсулируя свойства, такие как имя файла, байты и URL.
В программировании класс — это шаблон для создания объектов. Он определяет свойства (данные) и методы (функции), принадлежащие объектам этого типа.
Например,
- Класс
Carможет иметь свойства, такие какcolorиspeed, и методы, такие какdrive()иstop(). - В FlutterFlow класс, такой как
FFPlace, может иметь свойства, такие какaddressиlatLng, а также методы для манипуляции или получения этих значений.
Эти пользовательские классы FlutterFlow в сгенерированном коде в основном имеют префикс FF<ClassName> или FlutterFlow<ClassName>. Если вам нужно получить доступ к этим классам в вашем пользовательском коде, просто введите "FF" или "FlutterFlow" в редакторе кода, чтобы быстро их найти.

Использование компонентов в пользовательском виджете
Используйте этот подход только в том случае, если компонент является фиксированным элементом, который не изменяется в разных сценариях использования. Если дочерний компонент должен изменяться в зависимости от выбора пользователя, передавайте его напрямую как параметр.
В пользовательском виджете вы можете интегрировать ранее созданный компонент FlutterFlow напрямую, что избавляет от необходимости повторно создавать содержимое дочерних элементов в коде. Например, если вы создаете пользовательский виджет для отображения пользовательских диалоговых окон или нижних панелей с использованием пакета из pub.dev, вы можете просто вернуть существующий компонент, созданный на холсте, вместо написания нового с нуля.
При ссылке на класс компонента в вашем коде FlutterFlow автоматически добавит необходимое предложение import.

Получение темы FlutterFlow в пользовательском виджете
При создании пользовательских виджетов часто требуется стилизовать части виджета, например, устанавливать цвета. Вместо использования жестко заданных значений цветов вы можете напрямую обращаться к теме FlutterFlow. Эта тема обеспечивает единообразное оформление по всему приложению и отражает цвета, установленные вами или разработчиком проекта.
Для доступа к цветам темы в вашем пользовательском виджете используйте метод FlutterFlowTheme.of(context). Это позволяет получить любое свойство темы, такое как стандартный primary, primaryBackground или другие пользовательские цвета, а также стили текста, такие как bodyLarge или bodyMedium, обеспечивая соответствие пользовательского виджета общей теме приложения.
Вот пример того, как использовать основной цвет из темы FlutterFlow в пользовательском виджете:
Убедитесь, что вы импортировали import '../flutter_flow/flutter_flow_theme.dart'; при доступе к FlutterFlowTheme в ваших пользовательских виджетах.
class CustomButton extends StatefulWidget {
final String label;
CustomButton({required this.label});
@override
_CustomButtonState createState() => _CustomButtonState();
}
class _CustomButtonState extends State<CustomButton> {
bool isPressed = false;
void toggleButton() {
setState(() {
isPressed = !isPressed;
});
}
@override
Widget build(BuildContext context) {
return ElevatedButton(
style: ElevatedButton.styleFrom(
backgroundColor: isPressed
? FlutterFlowTheme.of(context).primary // Primary color when pressed
: FlutterFlowTheme.of(context).secondaryBackground, // Default color
foregroundColor: FlutterFlowTheme.of(context).secondaryText, // Text color
),
onPressed: toggleButton,
child: Text(
widget.label,
style: FlutterFlowTheme.of(context).bodyText1, // Themed text style
),
);
}
}
Изменение состояния приложения из пользовательского кода
В FlutterFlow вы можете обращаться к состоянию приложения или обновлять его напрямую из редактора потоков действий. Однако в определенных сценариях может потребоваться доступ или изменение состояния приложения в пользовательском коде для большего контроля над потоком операций. Класс FFAppState также предоставляет дополнительные вспомогательные функции для изменения значений состояния приложения. Давайте рассмотрим несколько примеров:
Убедитесь, что вы импортировали import '../../flutter_flow/flutter_flow_util.dart'; при доступе к FFAppState в ресурсах пользовательского кода.
- Получение значения состояния приложения в пользовательском коде
Future getCartItems() async {
// Retrieve the current cart items from AppState
final currentCartItems = FFAppState().cartItems;
print('Current Cart Items: $currentCartItems');
}
- Обновление значений состояния приложения в пользовательском коде
Future enableDarkMode() async {
// Enable dark mode in AppState
FFAppState().update(() {
FFAppState().enableDarkMode = true;
});
print('Dark mode enabled');
}
- Изменение списка в состоянии приложения с использованием вспомогательных функций
Класс FFAppState предлагает множество вспомогательных функций для удобного управления переменными списков в состоянии приложения. Для подробного обзора этого сгенерированного класса ознакомьтесь с этим руководством. Вот несколько примеров того, как использовать эти вспомогательные функции для изменения переменной списка в состоянии приложения:
Future addLocation(LatLng value) async {
// Add a new location to the LatLng list
FFAppState().addToLatLngList(value);
}
Future removeLocation(LatLng value) async {
// Remove a specific location from the LatLng list
FFAppState().removeFromLatLngList(value);
}
Future removeLocationAtIndex(int index) async {
// Remove a location at a specific index from the LatLng list
FFAppState().removeAtIndexFromLatLngList(index);
}
Future updateLocationAtIndex(int index, LatLng Function(LatLng) updateFn) async {
// Update a location at a specific index in the LatLng list
FFAppState().updateLatLngListAtIndex(index, updateFn);
}
Future insertLocationAtIndex(int index, LatLng value) async {
// Insert a new location at a specific index in the LatLng list
FFAppState().insertAtIndexInLatLngList(index, value);
}
Использование пользовательских типов данных
При создании пользовательского типа данных в FlutterFlow генерируется соответствующий класс <Name>Struct. В пользовательском коде FlutterFlow вы можете создавать новые экземпляры таких типов данных, передавать экземпляры обратно в действие или манипулировать и получать информацию из существующих объектов. Вот несколько примеров, иллюстрирующих работу с примером кл асса ProductStruct.
Пример 1: Создание нового экземпляра ProductStruct
Чтобы создать новый экземпляр ProductStruct, инициализируйте его с необходимыми свойствами:
// Create a new instance of ProductStruct
final newProduct = ProductStruct(
productId: '123',
name: 'Example Product',
description: 'A sample product description.',
category: 'Electronics',
subCategory: 'Mobile Phones',
price: PriceStruct(amount: 299.99, currency: 'USD'),
sizes: ['Small', 'Medium', 'Large'],
colors: [ColorsStruct(colorName: 'Red', colorHex: '#FF0000')],
images: [ImagesStruct(thumbnail: 'https://example.com/image.jpg')],
stockStatus: StockStatusStruct(xs: 0, small: 2),
reviews: [ReviewsStruct(rating: 4, comment: 'Great product!')],
);