點樣 Flutter 做 responsive layout?

xemexpress
Mar 17, 2024

--

Responsive UI layout. (Image from here.)
Responsive UI (Source: Interactive Design)

喺 web dev 就可以用 Boostrap 嘅 Grid,但 Flutter 呢?之前成日以為得 LayoutBuilder,雖然就唔係覺得好方便,但都足以令我遲遲未用,直到我喺呢度發現左好野,極度好用嘅extension 一個:

import 'package:flutter/material.dart';

class ScreenSize {
static const mobileLandscapeScreenWidth = 640;
static const tabletScreenWidth = 768;
static const desktopScreenWidth = 1024;
static const ultraScreenWidth = 1280;
}

extension ResponsiveExtension on BuildContext {
T responsive<T>(
T defaultVal, {
T? sm,
T? md,
T? lg,
T? xl,
}) {
final wd = MediaQuery.of(this).size.width;

return wd >= ScreenSize.ultraScreenWidth
? (xl ?? lg ?? md ?? sm ?? defaultVal)
: wd >= ScreenSize.desktopScreenWidth
? (lg ?? md ?? sm ?? defaultVal)
: wd >= ScreenSize.tabletScreenWidth
? (md ?? sm ?? defaultVal)
: wd >= ScreenSize.mobileLandscapeScreenWidth
? (sm ?? defaultVal)
: defaultVal;
}
}

我第一眼望落其實有少少抗拒,但之後就覺得好好用,唔係 state manage 個介面 size,又唔洗下下要 MediaQuery.of(context) 黎 check,更加唔洗 LayoutBuilder。唯一 concern 可能係變 size 嘅時候(例如拉大屏幕邊框,engine 要 update 好多 widgets,但一般黎講使用嘅時候好少話屏幕成日變?

如果大家發現呢個方法有唔妥當嘅地方請留言,如果我發現我都會即時喺度更新,除非都係覺得無問題。

多謝收睇。

--

--

xemexpress

洛克菲勒如是說「在我看來,這種慈善指的是精力或時間或財富的投入,它包括為僱用的員工提供豐厚報酬的能力,拓展和發展現有資源的能力,為員工提供之前沒有的發展機會和健康工作環境的能力。只有這些才能帶來持久和有益的結果,單純給錢無法與此相提並論。」。