Flutter登錄校驗(yàn)路由重定向

說明

很多時(shí)候我們需要對(duì)是否登錄進(jìn)行校驗(yàn)伸眶,有些頁(yè)面假如沒有登錄的話惊窖,不能進(jìn)行跳轉(zhuǎn),要先跳轉(zhuǎn)登錄頁(yè)厘贼,這里我們使用getx來實(shí)現(xiàn)路由的重定向

代碼實(shí)現(xiàn)

這里我們使用GetPage中間件(middlewares)來實(shí)現(xiàn)界酒,首先我們需要先繼承GetMiddleware實(shí)現(xiàn)自己的MyGetMiddleware,然后重寫redirect方法嘴秸,進(jìn)行校驗(yàn)并返回對(duì)應(yīng)的對(duì)象盾计,如果校驗(yàn)成功返回null即可就是走默認(rèn)的路由,如果校驗(yàn)失敗就返回RouteSettings對(duì)象重定向登錄頁(yè)(這里我用隨機(jī)數(shù)來模擬校驗(yàn))

class MyGetMiddleware extends GetMiddleware{
  @override
  RouteSettings? redirect(String? route) {
    return Random().nextInt(2) == 1 ? RouteSettings(name: '/login') : null;
  }
}

然后我們?cè)谂渲肎etPages的時(shí)候?qū)π枰r?yàn)的頁(yè)面設(shè)置中間件(這里我對(duì)SecondPage進(jìn)行校驗(yàn))

class MyApp extends StatelessWidget {
  const MyApp({super.key});
  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
        initialRoute: '/',
        getPages: [
          GetPage(name: '/', page: () => const MyHomePage(title: 'Flutter Demo Home Page')),
          GetPage(name: '/second', page: () => SecondPage(),middlewares: [MyGetMiddleware()]),
          GetPage(name: '/login', page: () => LoginPage()),
        ],
        title: 'Flutter Demo',
        theme: ThemeData(
          colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
          useMaterial3: true,
        )
    );
  }
}

完整代碼如下

import 'dart:math';

import 'package:flutter/material.dart';
import 'package:get/get.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});
  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
        initialRoute: '/',
        getPages: [
          GetPage(name: '/', page: () => const MyHomePage(title: 'Flutter Demo Home Page')),
          GetPage(name: '/second', page: () => SecondPage(),middlewares: [MyGetMiddleware()]),
          GetPage(name: '/login', page: () => LoginPage()),
        ],
        title: 'Flutter Demo',
        theme: ThemeData(
          colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
          useMaterial3: true,
        )
    );
  }
}

class Controller extends GetxController{
  var count = 0.obs;
  increment() => count++;
}

class MyGetMiddleware extends GetMiddleware{
  @override
  RouteSettings? redirect(String? route) {
    return Random().nextInt(2) == 1 ? RouteSettings(name: '/login') : null;
  }
}


class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  // 使用Get.put()實(shí)例化你的類赁遗,使其對(duì)當(dāng)下的所有子路由可用署辉。
  final Controller c = Get.put(Controller());
  int _counter = 0;

  Future<void> _showMyDialog() async {
    return showDialog<void>(
      context: context,
      barrierDismissible: false, // user must tap button!
      builder: (BuildContext context) {
        return Dialog(
          shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.all(Radius.circular(5))
          ),
          child: Container(
            height: 200,
            decoration: BoxDecoration(
                borderRadius: BorderRadius.all(Radius.circular(5)),
                color: Colors.white
            ),
            padding: EdgeInsets.fromLTRB(15, 20, 15, 20),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.center,
              children: <Widget>[
                Text('添加標(biāo)簽', style: TextStyle(color: Colors.black, fontSize: 16),),
                SizedBox(height: 20,),
                Container(
                  height: 40,
                  decoration: BoxDecoration(
                      color: Color(0xFFF6F6F6),
                      borderRadius: BorderRadius.all(Radius.circular(10))
                  ),
                )
              ],
            ),
          ),
        );
      },
    );
  }

  void _incrementCounter() async{
    Get.toNamed('/second');
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Expanded(child: Container(
              color: Colors.blue,
              child: Obx(() => Text("Clicks: ${c.count}")),
            )),
            Container(
              width: 200,
              child: AspectRatio(
                aspectRatio: 2,
                child: Image.asset("assets/images/ic_test.png",fit: BoxFit.fill,),
              ),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

class SecondPage extends StatelessWidget {
  // 你可以讓Get找到一個(gè)正在被其他頁(yè)面使用的Controller,并將它返回給你岩四。
  final Controller c = Get.find();
  SecondPage({super.key});

  @override
  Widget build(BuildContext context) {
    // 訪問更新后的計(jì)數(shù)變量
    return Scaffold(
        body: Center(
            child: Column(
              children: [
                Obx(()=>
                    Text("${c.count}")
                ),
                ElevatedButton(onPressed: ()=>{
                  c.increment()
                }, child: Text("點(diǎn)擊"))
              ],
            )
        )
    );
  }
}

class LoginPage extends StatelessWidget {
  LoginPage({super.key});

  @override
  Widget build(BuildContext context) {
    // 訪問更新后的計(jì)數(shù)變量
    return Scaffold(
        body: Center(
            child:Text(
              "登錄",style: TextStyle(fontSize: 50),
            )
        )
    );
  }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末哭尝,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子剖煌,更是在濱河造成了極大的恐慌材鹦,老刑警劉巖逝淹,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異桶唐,居然都是意外死亡栅葡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門尤泽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來欣簇,“玉大人,你說我怎么就攤上這事坯约⌒苎剩” “怎么了?”我有些...
    開封第一講書人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵闹丐,是天一觀的道長(zhǎng)横殴。 經(jīng)常有香客問我,道長(zhǎng)卿拴,這世上最難降的妖魔是什么衫仑? 我笑而不...
    開封第一講書人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮堕花,結(jié)果婚禮上惑畴,老公的妹妹穿的比我還像新娘。我一直安慰自己航徙,他們只是感情好如贷,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著到踏,像睡著了一般杠袱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上窝稿,一...
    開封第一講書人閱讀 52,793評(píng)論 1 314
  • 那天楣富,我揣著相機(jī)與錄音,去河邊找鬼伴榔。 笑死纹蝴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的踪少。 我是一名探鬼主播塘安,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼援奢!你這毒婦竟也來了兼犯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎切黔,沒想到半個(gè)月后砸脊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纬霞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年凌埂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诗芜。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瞳抓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绢陌,到底是詐尸還是另有隱情挨下,我是刑警寧澤熔恢,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布脐湾,位于F島的核電站,受9級(jí)特大地震影響叙淌,放射性物質(zhì)發(fā)生泄漏秤掌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一鹰霍、第九天 我趴在偏房一處隱蔽的房頂上張望闻鉴。 院中可真熱鬧,春花似錦茂洒、人聲如沸孟岛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)渠羞。三九已至,卻和暖如春智哀,著一層夾襖步出監(jiān)牢的瞬間次询,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工瓷叫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留屯吊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓摹菠,卻偏偏與公主長(zhǎng)得像盒卸,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子次氨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容