ساخت اپلیکیشن قطب نما با فلاتر — از صفر تا صد

۱۶۲ بازدید
آخرین به‌روزرسانی: ۰۳ مهر ۱۴۰۲
زمان مطالعه: ۳ دقیقه
ساخت اپلیکیشن قطب نما با فلاتر — از صفر تا صد

در این مقاله به بررسی روش ساخت اپلیکیشن قطب نما با فلاتر می‌پردازیم. فلاتر یک SDK محبوب برای توسعه UI/UX چند پلتفرمی است که امکانات خوبی برای تبدیل سریع مفاهیم و ایده‌ها به پروتوتایپ ارائه می‌کند. همچنین با استفاده از فلاتر می‌توان این پروتوتایپ‌ها را به کامپوننت‌ها و اپلیکیشن‌های آماده پروداکشن تبدیل کرد.

برای نصب فلاتر روی سیستم‌های مک می‌توانید به این صفحه (+) مراجعه کنید. سورس کد کامل پروژه مورد بررسی در این راهنما نیز از طریق این ریپوی گیت‌هاب (+) در اختیار شما قرار دارد.

تنظیم پروژه

پیکربندی پروژه در یک فایل استاندارد به نام pubspec.yaml قرار دارد:

1name: flutter_compass_demo
2description: An example app demonstrating how to build a compass.
3version: 1.0.0+1
4
5environment:
6  sdk: ">=2.1.0 <3.0.0"
7
8dependencies:
9  flutter:
10    sdk: flutter
11  flutter_compass: ^0.3.4
12
13dev_dependencies:
14  flutter_test:
15    sdk: flutter
16
17flutter:
18  uses-material-design: true

در این پروژه اقدام به ایمپورت کردن flutter_compass (+) می‌کنیم که یک پلاگین ساده با استریم رویداد است که جهتگیری قرار گرفتن گوشی را به صورت درجه از 0 تا 360 بازگشت می‌دهد. این داده‌ها در اپلیکیشن دریافت شده و برای چرخاندن عقربه قطب‌نما برای نمایش جهت شمال مورد استفاده قرار می‌گیرد.

فایل اصلی اپلیکیشن

در ادامه، سورس مربوط به این اپلیکیشن را آورده‌ایم.

کل سورس این اپلیکیشن ساده در فایل lib/main.dart قرار دارد:

1import 'dart:math';
2import 'package:flutter/material.dart';
3import 'package:flutter_compass/flutter_compass.dart';
4
5void main() => runApp(CompassDemo());
6
7class CompassDemo extends StatelessWidget {
8
9    @override
10    Widget build(BuildContext context) => MaterialApp(
11        title: 'Flutter Compass Demo',
12        theme: ThemeData(brightness: Brightness.dark),
13        darkTheme: ThemeData.dark(),
14        home: Scaffold(
15            appBar: AppBar(title: Text('Flutter Compass Demo')),
16            backgroundColor: Colors.black,
17            body: Compass()
18        )
19    );
20}
21
22class Compass extends StatefulWidget {
23
24    Compass({Key key}) : super(key: key);
25
26    @override
27    _CompassState createState() => _CompassState();
28}
29
30class _CompassState extends State<Compass> {
31
32    double _heading = 0;
33
34    String get _readout => _heading.toStringAsFixed(0) + '°';
35
36    @override
37    void initState() {
38        
39        super.initState();
40        FlutterCompass.events.listen(_onData);
41    }
42    
43    void _onData(double x) => setState(() { _heading = x; });
44
45    final TextStyle _style = TextStyle(
46        color: Colors.red[50].withOpacity(0.9), 
47        fontSize: 32, 
48        fontWeight: FontWeight.w200,
49    );
50
51    @override
52    Widget build(BuildContext context) {
53
54        return CustomPaint(
55            foregroundPainter: CompassPainter(angle: _heading),
56            child: Center(child: Text(_readout, style: _style))
57        );
58    }
59}
60
61class CompassPainter extends CustomPainter {
62
63    CompassPainter({ @required this.angle }) : super();
64
65    final double angle;
66    double get rotation => -2 * pi * (angle / 360);
67
68    Paint get _brush => new Paint()
69        ..style = PaintingStyle.stroke
70        ..strokeWidth = 2.0;
71
72    @override
73    void paint(Canvas canvas, Size size) {
74
75        Paint circle = _brush
76            ..color = Colors.indigo[400].withOpacity(0.6);
77
78        Paint needle = _brush
79            ..color = Colors.red[400];
80        
81        double radius = min(size.width / 2.2, size.height / 2.2);
82        Offset center = Offset(size.width / 2, size.height / 2);
83        Offset start = Offset.lerp(Offset(center.dx, radius), center, .4);
84        Offset end = Offset.lerp(Offset(center.dx, radius), center, 0.1);
85        
86        canvas.translate(center.dx, center.dy);
87        canvas.rotate(rotation);
88        canvas.translate(-center.dx, -center.dy);
89        canvas.drawLine(start, end, needle);
90        canvas.drawCircle(center, radius, circle);
91    }
92
93    @override
94    bool shouldRepaint(CustomPainter oldDelegate) => true;
95}

چنان که می‌بینید کتابخانه math زبان Dart نیز همراه با پکیج flutter_compass ایمپورت شده است. کلاس CompassDemo یک MaterialApp با عنوان، قالب و صفحه اصلی استاندارد می‌سازد که شامل یک Scaffold و یک AppBar و همچنین وهله‌ای از ویجت Compass به عنوان بدنه اصلی اپلیکیشن است.

کلاس Compass خودش یک پیاده‌سازی از StatefulWidget (+) محسوب میشود که ویجتی است که می‌تواند داده‌های State (+) تغییرپذیر را نگهداری کند. حالت این کلاس compass دارای یک مشخصه ‎_heading و یک accessor برای readout است که جهت‌گیری گوشی را به صورت رشته‌ای در قالب درجه بازگشت می‌دهد. متد initState یک شنونده رویداد روی پلاگین compass می‌سازد که وقتی جهت‌گیری تغییر یابد (یعنی کاربر جابجا شود و زاویه قطب‌نما تغییر یابد)، فراخوانی می‌شود. هنگامی که دستگیره شنونده رویداد پلاگین اقدام به فراخوانی onData با داده‌های جدید بکند، setState برای به‌روزرسانی جهت‌گیری فراخوانده می‌شود و موجب رسم مجدد UI کامپوننت می‌شود.

استایل خوانش به مقدار TextStyle روی مشخصه the _style تنظیم می‌شود و متد build ویجت یک شیء CustomPaint (+) بازگشت می‌دهد که خوانش متن را برای جهت‌گیری رندر می‌کند. همچنین دایره قطب‌نما و عقربه آن با استفاده از CompassPainter به عنوان یک painter پیش‌زمینه رندر می‌شود.

کلاس CompassPainter یک پیاده‌سازی از CustomPainter است که یک پارامتر گرفته و میزان چرخش را برحسب رادیان محاسبه می‌کند تا روی قطب‌نما اعمال شود. accessor به نام ‎_brush یک شیء paint جدید بازگشت می‌دهد که به عنوان براش پیش‌فرض مورد اجرا قرار می‌گیرد.

متد paint شیءهای براش را برای circle و needle تعریف کرده و مقادیر radius ،center ،start و end را محاسبه می‌کند. تابع translate نیز برای قرار دادن مرکز آفست چرخش مورد استفاده قرار می‌گیرد. سپس از تابع rotate برای مطابقت با مقدار rotation که در بخش فوق تعریف شده استفاده می‌شود. قالب و عقربه قطب‌نما با استفاده از drawLine و drawCircle رسم می‌شوند که این موارد را روی بوم در حال چرخش رسم می‌کند و عقربه را همواره به سمت شمال مغناطیسی نگه می‌دارد.

سخن پایانی

فلاتر یک SDK عالی برای ساخت انواع مختلفی از اپلیکیشن‌های چند پلتفرمی است که از سخت‌افزار گوشی برای خلق تجربه تعاملی کامل بهره می‌گیرد. اپلیکیشن دمویی که در این راهنما معرفی کردیم، نشان می‌دهد که ساخت یک UX مبتنی بر رویداد در یک فایل منفرد Dart تا چه حد آسان است.

ساخت اپلیکیشن قطب نما با فلاتر

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۳ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
itnext.io
نظر شما چیست؟

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