کلاس Navigation
در طول اجرای یک برنامه بارها و بارها نیاز می شود که از نمایی (Screen) به نمای دیگر جابجا شده و مجدد برگردید . مدیریت جابجایی بین نماها توسط کلاس Navigation صورت می پذیرد . این کلاس در واقع پشته ای (Stack) از نماها ایجاد می کند و توسط push و pop ورود و خروج به این پشته را مدیریت می نماید .
روش اول : جابجایی با استفاده از دستور Navigator.push
قطعه کد زیر نمونه ای از جابجایی بین نماها به روش Navigator.push را نمایش می دهد :
import 'package:flutter/material.dart'; void main() => runApp(MaterialApp(debugShowCheckedModeBanner: false, home: MyHomeApp())); class MyHomeApp extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Navigation Test'), ), body: Center( child: RaisedButton( onPressed: () { Navigator.push(context, new MaterialPageRoute(builder: (context) { return MyPageTwo(); })); }, child: Text('برو صفحه دو'), ), ), ); } } class MyPageTwo extends StatelessWidget { @override Widget build(BuildContext context) { return Directionality( textDirection: TextDirection.rtl, child: Scaffold( appBar: AppBar( automaticallyImplyLeading: false, title: Row( children: <Widget>[ IconButton( icon: Icon(Icons.arrow_back), onPressed: () => Navigator.pop(context), ), Text('صفحه دوم') ], ), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ SizedBox( width: 100, height: 100, child: Image.network( 'https://javareshkian.ir/wp-content/uploads/2020/03/javareshkian4.png')), Text('به صفحه دوم خوش آمدید'), ], ), ), ), ); } }
همانطور که در خط ۱۵ کد فوق قابل مشاهده است ، در هر کجا که لازم شد به نمای دیگری مراجعه نمایید می توانید از قطعه کد زیر استفاده نمایید :
onPressed: () { Navigator.push( context, new MaterialPageRoute( builder: (context) { return MyPageTwo(); } ) ); }
در خط ۶ ، MyPageTwo نام ویجتی است که نمای صفحه ۲ ما را ایجاد می نماید . از آنجایی که ما در این لحظه در حال ایجاد یک شی از نوع MypageTwo هستیم به راحتی می توانید در سازنده کلاس هر مقداری که مد نظر دارید به صفحه ۲ پاس دهید .
خروجی کد فوق در تصویر زیر دیده می شود :
دریافت اطلاعات از نمای صفحه ۲
جهت دریافت اطلاعات از نمای صفحه ۲ نیز به جای اینکه در رویداد onPressed مستقیما Navigator.push را فراخوانی کنید ، آن را به یک تابع از نوع async منتقل کرده و مقدار برگشتی از طرف Navigator.pop را به روش زیر دریافت نمایید :
navigateAndDisplaySomeMessage(BuildContext context, ChatData chatData) async{ final ChatData result = await Navigator.push( context, MaterialPageRoute(builder: (context) => SingleUserChat(userData: chatData)) ); Scaffold.of(context).showSnackBar( new SnackBar(content: new Text(result.userName),duration: Duration(seconds: 1),) ); }
در این مثال navigateAndDisplaySomeMessage نام دلخواهی است که ما برای تابع خود در نظر گرفته ایم . این تابع از نوع async تعریف شده تا قبل از فراخوانی Navigator.push بتوانیم از دستور await استفاده نماییم . این کار باعث می شود برنامه بدون از کار افتادن ، منتظر دریافت نتیجه از نمای صفحه ۲ بماند . به محض دریافت نتیجه از نمای صفحه ۲ ، اجرای کد از خط ۲ مربوط به final result عبور کرده و خط ۷ مربوط به Scaffold.of اجرا می شود و توسط ویجت SnackBar یک کادر حاوی متن در پایین صفحه نمایش داده می شود .
همانطور که در خط ۴ کد فوق قابل مشاهده است در لحظه مقدار دهی به MaterialPageRoute ما یک شی از نوع ChatData را به ویجت SingleUserChat (صفحه ۲) پاس داده ایم . در صفحه ۲ نیز در لحظه بازگشت از کد زیر استفاده شده است تا مجدد مقدار دریافتی (userData) به فرم اصلی برگردانده شود :
IconButton( icon: Icon(Icons.arrow_back), onPressed: () => Navigator.pop(context, userData), )
روش دوم : جابجایی به روش Navigator.pushNamed
در صورتی که در لحظه جابجایی بین صفحات مقداری جابجا نمی شود ، می توانید از این روش جهت جابجایی استفاده نمایید . مزیت این روش این است که دستور مربوط به جابجایی بین تمام صفحات پروژه در یکجا ( خصوصیت routes مربوط به ویجت MaterialApp ) جمع آوری می شود و دسترسی به آنها ساده تر خواهد بود .
روش کار به این صورت است که ابتدا به روش زیر خصوصیت routes مربوط به ویجت MaterialApp را مقدار دهی می نمایید :
class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, title: 'WhatsApp', routes: { '/setting' : (context) => new SettingPage(), '/singleChat' : (context) => new SingleUserChat(userData: null) }, theme: ThemeData( fontFamily: 'Vazir', //primarySwatch: Colors.blue, primaryColor: Color(0xff075e54), // رنگ AppBar accentColor: Color(0xff075e54), // رنگ FloatingBottun ), home: Directionality( textDirection: TextDirection.rtl, child: Center(child: MyHomePage(text: 'واتساپ')), )); } }
سپس در مرحله فراخوانی Navigator مطابق کد زیر عمل می نمایید :
onPressed: () { //print('Floating Click'); Navigator.pushNamed(context, '/setting'); },
در این حالت فقط کافیست نام صفحه ای که در خصوصیت routes ویجت MaterialApp ثبت کرده اید توسط Navigator.pushNamed فراخوانی نمایید .
یک نکته مهم در رابطه با Routing
در صورت استفاده از خصوصیت route ویجت MaterialApp شما می توانید از خصوصیت home این ویجت صرف نظر کنید و مقدار آن را در یکی از route ها تعریف نمایید . به کد زیر توجه نمایید :
class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, title: 'WhatsApp', initialRoute: '/splashscreen', // تعریف روت شروع کننده routes: { '/' : (context) => Directionality(textDirection: TextDirection.rtl,child: Center(child: MyHomePage(text: 'واتساپ'))), '/splashscreen' : (context) => new SplashScreen(), '/setting' : (context) => new SettingPage(), '/singleChat' : (context) => new SingleUserChat(userData: null) }, theme: ThemeData( fontFamily: 'Vazir', //primarySwatch: Colors.blue, primaryColor: Color(0xff075e54), // رنگ AppBar accentColor: Color(0xff075e54), // رنگ FloatingBottun ), // home: Directionality( // textDirection: TextDirection.rtl, // child: Center(child: MyHomePage(text: 'واتساپ')), // ) ); } }
همانطور که در کد فوق قابل مشاهده است ، ما یک روت با مقدار ‘/’ تعریف کرده ایم که کار home را انجام می دهد ، همچنین توسط خصوصیت initialRoute نام روت شروع کننده برنامه را تعیین کرده ایم و به این وسیله به برنامه اعلام کردیم که از این اسکرین برنامه را شروع کند .
جهت کسب اطلاعات بیشتر از این آدرس به سایت اصلی فلاتر مراجعه نمایید .
امیدوارم این مطلب برای شما مفید باشد .