Сегодняшняя тема — реализация пользовательского элемента управления выбором даты или пользовательского компонента во Flutter. Учитывая универсальность этого пользовательского компонента даты, мы начнем с разработки плагина, чтобы его можно было опубликовать. pub.dev для использования большинством разработчиков флаттера (хотя другие могут и не обязательно использовать его, но у нас должно быть небольшое требование для себя, верно!)
Таким образом, прочитав эту статью, вы усвоите два основных момента знаний:
Поскольку это практическая операция, я опишу полный процесс реализации. Сначала мы определяем, что нам нужно создать собственный компонент, и опубликовать его. pub.dev начальство,поэтому,Давайте сначала создадим проект плагина,Вы можете обратиться сюда。
flutter create --template=plugin --platforms=android,ios,linux,macos,windows date_picker
Во Flutter существует три основных способа создания пользовательских компонентов (также называемых пользовательскими виджетами): путем объединения других компонентов, самостоятельного рисования и реализации RenderObject.
Комбинируя другие компоненты:Это самый простой и распространенный способ создания пользовательских компонентов.。FlutterФреймворк предоставляет большое количество встроенных компонентов.,Например, текст, изображения, кнопки и т. д. Вы можете создавать свои собственные компоненты, комбинируя эти встроенные компоненты. Преимущество этого метода в том, что он прост и удобен в использовании.,Подходит для большинства сценариев. Например,Вы можете создать файл, содержащийизображениеи текстовая пользовательская кнопка。
class CustomButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
return FlatButton(
onPressed: () {},
child: Row(
children: <Widget>[
Icon(Icons.add),
Text('Add'),
],
),
);
}
}
самосинтез:Когда встроенные компоненты не соответствуют вашим потребностям,Вы можете выбрать самосинтез. Flutter предоставляет такие классы, как CustomPaint и Canvas.,Вы можете использовать эти классы для индивидуального рисования ваших компонентов. Преимущество этого подхода – высокая гибкость.,Вы можете нарисовать любую форму и стиль, какой захотите. но,Сложность этого метода также выше.,Требуются некоторые знания рисования. Например,Вы можете создать собственный индикатор выполнения.
class CustomProgressBar extends StatelessWidget {
@override
Widget build(BuildContext context) {
return CustomPaint(
painter: _ProgressBarPainter(),
);
}
}
class _ProgressBarPainter extends CustomPainter {
@override
void paint(Canvas canvas, Size size) {
// Нарисовать индикатор выполнения
}
@override
bool shouldRepaint(CustomPainter oldDelegate) {
return true;
}
}
РеализоватьRenderObject:Это способ создания пользовательского компонента самого низкого уровня.。FlutterСистема рендеринга основана наRenderObjectиз,Каждый компонент соответствует RenderObject. Реализуя свой собственный RenderObject,У вас есть полный контроль над расположением и чертежами ваших компонентов. Преимущество этого подхода – максимальная гибкость.,Но сложность тоже самая высокая.,Обычно используется только при создании настраиваемых компонентов или фреймворков.
Чтобы реализовать этот выбор дат, мы сначала анализируем требования и извлекаем эти функциональные точки.
Мы определяем компонент MonthView для отображения этого представления, и его основная функция — отображать представление календаря. Основная логика описана в этом разделе: как создать GridView.
List<Widget> dayTiles = [];
for (int i = 0; i < firstWeekdayOfMonth - 1; i++) {
dayTiles.add(Container()); // empty days to align the first day
}
for (int i = 1; i <= daysInMonth; i++) {
final day = DateTime(month.year, month.month, i);
final isSelected =
(day.isAfter(selectedStartDate.subtract(Duration(days: 1))) &&
day.isBefore(selectedEndDate.add(Duration(days: 1)))) ||
day == selectedStartDate ||
day == selectedEndDate;
BoxDecoration decoration;
if (isSelected) {
decoration = BoxDecoration(
color: Theme.of(context).primaryColor,
shape: BoxShape.circle,
);
} else {
decoration = BoxDecoration();
}
После завершения этой части логики мы эквивалентны завершению части рендеринга.
Эта часть выполнена по правилам. Конкретный код очень простой, комментарии также приведены ниже.
void _onDateSelected(DateTime selectedDate) {
setState(() {
// Если дата окончания не выбрана или выбранная дата начала позже выбранной в данный момент даты
if (selectedDate.isBefore(_selectedStartDate)) {
//меньше, чем дата крайнего левого интервала
_selectedStartDate = selectedDate;
} else if (selectedDate.isAfter(_selectedEndDate)) {
//Больше даты с интервалом
_selectedEndDate = selectedDate;
} else {
// находится внутри интервала, selectedDate и _lastSelectedDate Для сравнения, я дам вам меньший. _selectedStartDate, указывается больший _selectedEndDate
if (selectedDate.isAfter(_lastSelectedDate)) {
_selectedEndDate = selectedDate;
_selectedStartDate = _lastSelectedDate;
} else {
_selectedStartDate = selectedDate;
_selectedEndDate = _lastSelectedDate;
}
}
widget.onDateRangeSelected([_selectedStartDate, _selectedEndDate]);
_lastSelectedDate = selectedDate;
});
}
Разумеется, логика этой части написана автором на основе собственной модели мышления, которая может несколько отличаться от общепринятого выбора дат. Главное правило
После разработки плагина остается его опубликовать. Сначала вам необходимо проверить, есть ли какие-либо грамматические проблемы. Используйте следующую команду, чтобы проанализировать ваш код и убедиться в отсутствии грамматических ошибок:
flutter analyze
и запустите тест:
flutter test
Убедитесь, что все тесты пройдены и нет никаких важных проблем при анализе кода. Моё выполнение здесь действительно сообщало об ошибке, но исправить её несложно.
Следующий шаг — это собственно процесс публикации.,перед публикацией,Вам необходимо создать учетную запись на pub.dev. Затем,配置你изpubspec.yaml
документ,Убедитесь, что вся информация актуальна,включить номер версии、описывать、Автор и др.
Используйте следующую команду, чтобы опубликовать пакет:
flutter pub publish
Эта команда снова запустит анализатор, чтобы убедиться в отсутствии проблем, и предложит вам подтвердить опубликованную информацию.
Вы можете взглянуть,Плагины, сделанные нами,ОК здесьПроверять