ورود و عضویت
0
سبد خرید شما خالی است
0
سبد خرید شما خالی است

آموزش استایل دهی در فلاتر با کتابخانه division

در فریمورک فلاتر تمام عناصر یک ویجت هستند و این باعث میشود که با ترکیب کردن آنها رابط کاربری های پیچیده تر طراحی کنید که خب خیلی قابلیت خوبی هست.

با این حال این روش مقداری مشکلات در استایل دهی و تعیین مکان ویجت ها دارد.

در این روش مشکلات زیادی وجود دارد که با هم دیگه بررسی خواهیم کرد اما در ابتدا یک صفحه ساده فلاتر را با استفاده از امکاناتی که در اختیار داریم طراحی میکنیم.

class MessageDisplayClassic extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Container(
        child: Padding(
          padding: const EdgeInsets.all(16),
          child: Text(
            'Lorem ipsum dolor sit amet...',
            style: TextStyle(
              color: Colors.white,
              fontSize: 30,
              fontWeight: FontWeight.bold,
              fontStyle: FontStyle.italic,
            ),
          ),
        ),
        width: 350,
        decoration: BoxDecoration(
          color: Colors.green.shade800,
          borderRadius: BorderRadius.circular(8),
        ),
      ),
    );
  }
}

نتیجه کد های بالا تصویر زیر هست که مشاهده میکنید, یک باکس پیغام در وسط صفحه با گوشه های گرد شده.

division
آموزش کتابخانه division

همانطور که میبینید خروجی یک متن هست اما نیاز داریم که مقداری سایه, افکت ripple و انیمیشن به آن اضافه کنیم که با ویجت های بالا این امکان و نداریم.

البته که با امکانات پایه ای فلاتر این کار کاملا قابل انجام است اما اگر همین الان هم به کد ها نگاه کنید مبینید که خیلی کد تمیزی نیست و کاملا شلوغ شده.

استفاده از پکیج Division

Division یک کتابخانه است که مشکلات استفاده از استایل در Flutter را ساده تر کرده است.

برای حل مشکل استایل دهی در فلاتر از پکیجی به نام division استفاده میکنیم که توسعه دهندگان را از دردسر های مختلف نجات میدهد.

مشکلاتی مثل:

زمانی که نیاز دارید یک ویجت را در وسط صفحه قرار دهید حتما باید از ویجت Center استفاده کنید.

حالا نیاز دارید که به آن padding اضافه کنید؟ باید آن را داخل ویجت Padding قرار دهید.

اگر هم بخواهید که رنگ آن را عوض کنید باید یک Container اضافه کنید.

حالا نیاز دارید تا به Container مقداری elevation اضافه کنید؟ متاسفانه این کار با ویجت Card امکان پذیر است.

استفاده از انیمیشن در آیتم های لیست در Flutter

Division از روشی شبیه به CSS برای استایل دهی استفاده میکند.

کافیست که استایل خودتون و داخل یک آبجکت از نوع ParentStyle ذخیره کنید.

دیگر نیازی ندارید که از ویجت هایی مثل Padding, Card استفاده کنید برای داشتن استایل های مختلف.

همچنین یک کلاس که مخصوصا برای استایل دادن به متن طراحی شده هم در اختیار دارید به اسم TxtStyle.

برای شروع پکیج Division و به پروژه اضافه میکنیم.

dependencies:
  flutter:
    sdk: flutter
  division: ^0.8.2

حالا کد های قبلی و بازنویسی میکنیم.

class MessageDisplayDivision extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Parent(
      child: Container(
        child: Txt(
          'Lorem ipsum dolor sit amet...',
          style: TxtStyle()
            ..textColor(Colors.white)
            ..fontSize(30)
            ..bold()
            ..italic()
            ..textAlign.start(),
        ),
      ),
      style: ParentStyle()
        ..alignment.center()
        ..padding(all: 16)
        ..width(350)
        ..background.color(Colors.green.shade800)
        ..borderRadius(all: 8),
    );
  }
}

این کد کمی متفاوت تر از کد قبلی است اما با کمی تشریح کردن متوجه میشوید که روش Division چقدر ساده است.

یک ویجت به اسم Parent تعریف میکنیم و برای آن هر فرزندی خواستیم تعریف میکنیم, این ویجت استایل های مخصوص خود را میتواند داشته باشد.

برای استایل دادن به متن هم کافیست از ویجت Txt  استفاده کنید, برای استایل دادن هم از ویژگی TxtStyle کمک بگیرید.

در این روش نیازی به استفاده از ویجت های Center و Padding هم نیست, میتوانید همچنین استایل ها را داخل یک کلاس ذخیره کرده در ویجت های مختلف از آنها استفاده کنید.

class MessageDisplayDivisionSimple extends StatelessWidget {
  ...

  @override
  Widget build(BuildContext context) {
    return Parent(
      child: Container(
        child: Txt(
          'Lorem ipsum dolor sit amet...',
          style: textStyle,
        ),
      ),
      style: containerStyle,
    );
  }
}

میتونید استایل ها را داخل یک متغیر استاتیک ذخیره کنید یا به صورت محلی در یک کلاس فقط, بستگی به خودتان دارد.

class MessageDisplayDivisionSimple extends StatelessWidget {
  final containerStyle = ParentStyle()
    ..alignment.center()
    ..padding(all: 16)
    ..width(350)
    ..background.color(Colors.green.shade800)
    ..borderRadius(all: 8);

  final textStyle = TxtStyle()
    ..textColor(Colors.white)
    ..fontSize(30)
    ..bold()
    ..italic()
    ..textAlign.start();

  ...
}

برای ادامه به استایل خودمون افکت Ripple , elevation و انیمیشن اضافه میکنیم.

final containerStyle = ParentStyle(angleFormat: AngleFormat.degree)
  ..alignment.center()
  ..padding(all: 16)
  ..width(350)
  ..background.color(Colors.green.shade800)
  ..borderRadius(all: 8)
  ..elevation(3)
  ..ripple(true)
  ..animate(100 /*milliseconds*/, Curves.decelerate);

برای قسمت انیمیشن زمان و درجه را مشخض کردیم.

اما به چه صورتی انیمیشن ویجت را فعال کنیم؟

این کار و با بروزرسانی مقدار دلخواه درون متد setState انجام میدهیم, پس اول رویداد کلیک برای متن خودمون مینویسیم.

با کتابخانه Division در فلاتر شما نیازی به قرار دادن ویجت داخل GestureDetector ندارید فقط کافیست از کلاس GestureClass استفاده کنید.

برای نمایش انیمیش متغیری داریم به نام isBeingTapped که زمان کلیک شدن مقدار آن آپدیت و انیمیش شروع می شود.

کلاس GestureClass سه متد دارد که برای اطمینان ما در هر سه متد مقدار این متغیر را بروز میکنیم.

class _MessageDisplayDivisionState extends State<MessageDisplayDivision> {
  bool isBeingTapped = false;
  ...
  @override
  Widget build(BuildContext context) {
    return Parent(
      ...
      gesture: GestureClass()
        ..onTapDown((_) {
          setState(() {
            isBeingTapped = true;
          });
        })
        ..onTapUp((_) {
          setState(() {
            isBeingTapped = false;
          });
        })
        ..onTapCancel(() {
          setState(() {
            isBeingTapped = false;
          });
        }),
    );
  }
}

آموزش استفاده از دیتابیس آماده در فلاتر

انیمیشن با Division

در بخش های قبلی انیمیشن را با کد زیر فعال کردیم.

animate(100 /*milliseconds*/, Curves.decelerate)

در این مورد انیمیشنی که ما میخواهیم ایجاد کنیم شامل elevation, scale و rotation می باشد.

این سه مقدار و با استفاده از استایل دهی containerStyle میتوانیم آپدیت کنیم.

در این حالت بهتر هست که استایل خودتون و داخل متغیر ذخیره کنید.

class MessageDisplayDivision extends StatefulWidget {
  @override
  _MessageDisplayDivisionState createState() => _MessageDisplayDivisionState();
}

class _MessageDisplayDivisionState extends State<MessageDisplayDivision> {
  bool isBeingTapped = false;

  final containerStyle = ParentStyle(angleFormat: AngleFormat.degree)
    ..alignment.center()
    ..padding(all: 16)
    ..width(350)
    ..background.color(Colors.green.shade800)
    ..borderRadius(all: 8)
    ..elevation(3)
    ..ripple(true)
    ..animate(100 /*milliseconds*/, Curves.decelerate);

  final textStyle = TxtStyle()
    ..textColor(Colors.white)
    ..fontSize(30)
    ..bold()
    ..italic()
    ..textAlign.start();

  @override
  Widget build(BuildContext context) {
    return Parent(
      child: Container(
        child: Txt(
          'Lorem ipsum dolor sit amet...',
          style: textStyle,
        ),
      ),
      style: containerStyle.clone()
        ..elevation(isBeingTapped ? 10 : 3)
        ..scale(isBeingTapped ? 1.1 : 1)
        ..rotate(isBeingTapped ? -10 : 0),
      gesture: GestureClass()
        ..onTapDown((_) {
          setState(() {
            isBeingTapped = true;
          });
        })
        ..onTapUp((_) {
          setState(() {
            isBeingTapped = false;
          });
        })
        ..onTapCancel(() {
          setState(() {
            isBeingTapped = false;
          });
        }),
    );
  }
}

بخش مهم کد بالا قسمت زیر است.

      style: containerStyle.clone()
        ..elevation(isBeingTapped ? 10 : 3)
        ..scale(isBeingTapped ? 1.1 : 1)
        ..rotate(isBeingTapped ? -10 : 0),

میبینید که که استایل دهی با این روش چقدر ساده, قابل استفاده مجدد و گسترش دادن است.

4 پاسخ به “آموزش استایل دهی در فلاتر با کتابخانه division”

  1. رحمان گفت:

    عالیه بود

  2. مرتضی گفت:

    سپاس از شما . لطفا در مورد دسترسی به نمایش مخاطبین گوشی هم مطلب بزارید

  3. علی رحمانی گفت:

    سلام. خیلی خوب میشه حتما رفرنس و منبعی که ترجمه میکنید رو هم اعلام کنید. مثل سایت رسوکودر

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

Hesam
18 آوریل 2020
آموزش فارسی فلاتر
آموزش فارسی flutter