Привет всем, я Алекс, у меня всего 24 часа в сутки, но 25 часов интенсивной учебы.
причина
Рыбу трогать нельзя, и ты никогда в этой жизни не прикоснешься к рыбе.
ПроисхождениеГо Лаоподелился твитом:поделиться.API.Weibo.cai/share/26900…
Внезапно мне в голову пришла такая мысль:Хороший материал, но я на MacBook и не могу использовать это приложение. Но, похоже, я могу написать один сам?
Готов к работе
Самое главное, что нужно молодежи, это действие, а я могу делать то, что хочу.Хотя я сейчас подправляю речь на DevFest, это не мешает мне написать приложение за 10 минут. Итак, я нанес серию комбо-ударов:
flutter config --enable-macos-desktop
flutter create --platforms=macos touch_fish_on_macos
Создан проект Flutter, поддерживающий macOS. (На данный момент прошло около 1 минуты)
начать печатать
найти ресурсы
Сначала нам нужно изображение высокой четкости и незакодированное изображение , здесь вы можете выполнить поиск в Интернете, следует отметить, что при использовании ЛОГОТИПА вы должны обратить внимание на проблемы с авторскими правами, вызванные сценой использования. После того, как найдёте картинку, бросьте еёassets/apple-logo.png
и добавьте ссылку на ресурс в pubspec.yaml:
flutter:
use-material-design: true
+ assets:
+ - assets/apple-logo.png
Подумайте о макете
Давайте посмотрим на экран Splash MacOS, есть несколько ключевых точек:
- Логотип находится в середине экрана, а фиксированный размер составляет около 100 д.;
- Интервал между ЛОГОТИПОМ и индикатором выполнения составляет около 100 dp;
- Индикатор выполнения имеет высоту около 5 dp и ширину около 200 dp, закругленные углы почти полностью покрывают высоту, часть значения белая, а часть фона — цвет заливки + светло-серая рамка.
(Не спрашивайте меня, почему эти вещи можно наблюдать, спрашивайте, чтобы научить пользовательский интерфейс менять пользовательский интерфейс каждый день.)
После подтверждения общего шаблона макета приступаем к построению макета. (К этому моменту прошло около 2 минут)
реализовать макет
Во-первых, отцентрируйте логотип, раскрасьте его, установите ширину на 100 и разместите верх и низ на 100:
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Spacer(),
Padding(
padding: const EdgeInsets.symmetric(vertical: 100),
child: Image.asset(
'assets/apple-logo.png',
color: CupertinoColors.white, // 使用 Cupertino 系列的白色着色
width: 100,
),
),
const Spacer(),
],
),
);
Затем поместите относительно верхний индикатор выполнения ниже:
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Spacer(),
Padding(
padding: const EdgeInsets.symmetric(vertical: 100),
child: Image.asset(
'assets/apple-logo.png',
color: CupertinoColors.white, // 使用 Cupertino 系列的白色
width: 100,
),
),
Expanded(
child: Container(
width: 200,
alignment: Alignment.topCenter, // 相对靠上中部对齐
child: DecoratedBox(
border: Border.all(color: CupertinoColors.systemGrey), // 设置边框
borderRadius: BorderRadius.circular(10), // 这里的值比高大就行
),
child: ClipRRect(
borderRadius: BorderRadius.circular(10), // 需要进行圆角裁剪
child: LinearProgressIndicator(
value: 0.3, // 当前的进度值
backgroundColor: CupertinoColors.lightBackgroundGray.withOpacity(.3),
color: CupertinoColors.white,
minHeight: 5, // 设置进度条的高度
),
),
),
),
],
),
);
На данный момент вы можете работать напрямую, и статический интерфейс подготовлен. (На данный момент прошло около 4 минут)
Откройте приложение, вы можете отложить его и повесить трубку, босс подходит к вам и может поболтать с вами об обновленном контенте.Однако интерфейс обновления никуда не денется, можно ли его назвать интерфейсом обновления?Когда начальник снова и снова проходит мимо вас и обнаруживает, что прогресс все тот же, возможно, он уже списан с вашей зарплаты, или вас уволили на следующий день за то, что вы зашли в офис и сели на стул.
Итак, следующий шаг — подумать о том, как заставить его двигаться.
анимация мышления
Давайте посмотрим, как выглядит анимация запуска:
- В начале нет индикатора выполнения;
- Полоса прогресса будет двигаться шаг за шагом, и скорость может не совпадать.
Основываясь на двух вышеуказанных условиях, я разработал метод обработки анимации:
- Длительность построения сегментов (
Duration
), которые можно свободно комбинировать по нескольким продолжительностям; - Количество длительностей прохождения анимации определяет окончательный прогресс каждой длительности;
- Каждая продолжительность управляет интервалом от начального значения до конечного значения.
Есть только три условия, так же просто, как взлететь и начать! (на данный момент прошло около 5 минут)
реализовать анимацию
начать одинAnimationController
:
class _HomePageState extends State<HomePage> with SingleTickerProviderStateMixin {
/// 巧用 late 初始化,节省代码量
late final AnimationController _controller = AnimationController(vsync: this);
/// 启动后等待的时长
Duration get _waitingDuration => const Duration(seconds: 5);
/// 分段的动画时长
List<Duration> get _periodDurations {
return <Duration>[
const Duration(seconds: 5),
const Duration(seconds: 10),
const Duration(seconds: 4),
];
}
/// 当前进行到哪一个分段
final ValueNotifier<int> _currentPeriod = ValueNotifier<int>(1);
Далее реализуется метод анимации, и используется метод рекурсивного вызова для уменьшения контроля над цепочкой вызовов:
@override
void initState() {
super.initState();
// 等待对应秒数后,开始进度条动画
Future.delayed(_waitingDuration).then((_) => _callAnimation());
}
Future<void> _callAnimation() async {
// 取当前分段
final Duration _currentDuration = _periodDurations[currentPeriod];
// 准备下一分段
currentPeriod++;
// 如果到了最后一个分段,取空
final Duration? _nextDuration = currentPeriod < _periodDurations.length ? _periodDurations.last : null;
// 计算当前分段动画的结束值
final double target = currentPeriod / _periodDurations.length;
// 执行动画
await _controller.animateTo(target, duration: _currentDuration);
// 如果下一分段为空,即执行到了最后一个分段,重设当前分段,动画结束
if (_nextDuration == null) {
currentPeriod = 0;
return;
}
// 否则调用下一分段的动画
await _callAnimation();
}
Приведенные выше несколько строк кода прекрасно реализуют анимацию индикатора выполнения. (На данный момент прошло около 8 минут)
Последний шаг — привязать анимацию и сегмент к индикатору выполнения, индикатор выполнения не отображается до ввода сегмента, а соответствующий прогресс отображается после запуска анимации:
ValueListenableBuilder<int>(
valueListenable: _currentPeriod,
builder: (_, int period, __) {
// 分段为0时,不展示
if (period == 0) {
return const SizedBox.shrink();
}
return DecoratedBox(
decoration: BoxDecoration(
border: Border.all(color: CupertinoColors.systemGrey),
borderRadius: BorderRadius.circular(10),
),
child: ClipRRect(
borderRadius: BorderRadius.circular(10),
child: AnimatedBuilder( // 使用 AnimatedBuilder,在动画进行时触发更新
animation: _controller,
builder: (_, __) => LinearProgressIndicator(
value: _controller.value, // 将 controller 的值绑定给进度
backgroundColor: CupertinoColors.lightBackgroundGray.withOpacity(.3),
color: CupertinoColors.white,
minHeight: 5,
),
),
),
);
},
)
Готово, всего 10 минут, побегаем посмотрим эффект. (Рисунок 22.1 М ниже)
Эта степень реставрации, кого она не смущает? 🤩С этого момента начните дорогу на работу на рыбалку...
Релиз пакета
Выпустить официальную версию приложения для macOS сложнее, но мы можем упаковать ее для собственного использования, и для этого потребуется всего одна строка команды:flutter build macos
.
После успеха продукт будет выводиться вbuild/macos/Build/Products/Release/touch_fish_on_macos.app
, дважды щелкните, чтобы использовать.
Эпилог
На данный момент разработано простое приложение Moyu Flutter, которое может работать на macOS. Полная демонстрация доступна в моем репозитории:GitHub.com/Alex V525/legal…. Вы можете дать ему некоторые требования, я думаю, что такое программное обеспечение довольно интересно.
Большинство людей, возможно, не думали, что написать приложение Flutter, работающее на macOS, может быть так просто. Конечно, в кажущиеся короткими 10 минут не входило время на установку окружения, поиск материалов и отправку в git, но за это время их было более чем достаточно для выполнения сопутствующих вещей.
Я надеюсь, что эта статья пробудит ваш интерес к изучению флаттера, или к попытке попробовать его на рабочем столе, или бросит вызов вашей собственной скорости программирования (не говорите, что 10 минут невозможно, на самом деле мне нужно меньше времени.
Если у вас есть какие-либо вопросы, связанные с Flutter, добро пожаловать на общение со мной в области комментариев, и все приветствуются.Присоединяйтесь к самой активной группе Flutter (FlutterCandies🍭)Напрямую связывайтесь с большинством авторов высококачественного контента Flutter в Китае (включая меня), Олли!