簡體   English   中英

導航到 Flutter 中的新屏幕

[英]Navigate to a new screen in Flutter

如何導航到 Flutter 中的新屏幕?

這些問題很相似,但問的比我多。

我在下面添加一個答案。

導航到新屏幕:

Navigator.of(context).push(MaterialPageRoute(builder: (context) => NewScreen()));

其中context是小部件的 BuildContext , NewScreen是第二NewScreen部件布局的名稱。

在此處輸入圖片說明

代碼

main.dart

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Home Screen')),
      body: Center(
        child: RaisedButton(
          child: Text(
            'Navigate to a new screen >>',
            style: TextStyle(fontSize: 24.0),
          ),
          onPressed: () {
            _navigateToNextScreen(context);
          },
        ),
      ),
    );
  }

  void _navigateToNextScreen(BuildContext context) {
    Navigator.of(context).push(MaterialPageRoute(builder: (context) => NewScreen()));
  }
}

class NewScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('New Screen')),
      body: Center(
        child: Text(
          'This is a new screen',
          style: TextStyle(fontSize: 24.0),
        ),
      ),
    );
  }
}

也可以看看

使用Navigator.push()導航到下一個屏幕並返回

Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondRoute()),);

使用Navigator.pushReplacement()導航到下一個屏幕而不返回

Navigator.pushReplacement(
context,MaterialPageRoute(builder: (context) => SecondRoute()),);

要使用 Flutter 預制動畫加載新屏幕,請使用它們各自的過渡類。 例如:

容器改造

在此處輸入圖片說明

基本上,我們將第一個小部件或屏幕轉換為下一個屏幕。 為此,我們需要使用OpenContainer 以下代碼說明了 ListView 中的一個項目轉換為其詳細信息頁面。

  @override
  Widget build(BuildContext context) {
    return Card(
      color: Colors.white,
      elevation: 2.0,
      child: OpenContainer(
        transitionType: ContainerTransitionType.fadeThrough,
        closedColor: Theme.of(context).cardColor,
        closedElevation: 0.0,
        openElevation: 4.0,
        transitionDuration: Duration(milliseconds: 1500),
        openBuilder: (BuildContext context, VoidCallback _) => THENEXTSCREEN(),
        closedBuilder: (BuildContext _, VoidCallback openContainer) {
          return ListTile(
            leading: Icon(Icons.album),
            title: Text("ITEM NAME"),
          );
        },
      ),
    );
  }

共享軸

在此處輸入圖片說明

此轉換類似於 Tab 或 Stepper 中的轉換。 我們需要SharedAxisTransitionPageTransitionSwitcher ,具有為激活狀態和前一頁之間的模式轉型一起。 如果我們只在兩個頁面之間切換,我們可以為它使用一個簡單的布爾值isFirstPage 以下是 Provider 作為狀態管理的片段:

  @override
  Widget build(BuildContext context) {
    return Consumer<YourState>(
      builder: (context, state, child) {
        return PageTransitionSwitcher(
          duration: const Duration(milliseconds: 1500),
          reverse: !state.isFirstPage, // STATE
          transitionBuilder: (
            Widget child,
            Animation<double> animation,
            Animation<double> secondaryAnimation,
          ) {
            return SharedAxisTransition(
              child: child,
              animation: animation,
              secondaryAnimation: secondaryAnimation,
              transitionType: SharedAxisTransitionType.horizontal,
            );
          },
          child: state.isFirstPage? FIRSTPAGE() : SECONDPAGE(), // STATE
        );
      },
    );
  }

請注意,在所有這些場景中,我們不使用 Navigator 和 MaterialPageRoute。 所有這些代碼都來自動畫存儲庫,因此您可能需要先查看一下。

onTap: () {
  Navigator.push(context,
      MaterialPageRoute(builder: (context) => NextScreenName()));
}

如果您熟悉 Web 開發,則此方法類似於路由。

main.dart

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      routes: {
        '/' : (BuildContext context)=>HomePage(),
        '/register' : (BuildContext context)=>RegisterPage(),
      },
    );
  }
}

您可以從homepage.dart添加按鈕onPressed事件來導航register.dart如下。

onPressed: (){
    Navigator.pushReplacementNamed(context, '/register');
 },

這是路由推送/彈出的完整示例:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Routes',
      routes: {
        '/login': (BuildContext context) => Login(),
        // add another route here
        // '/register': (BuildContext context) => Register(),
      },
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Routes'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            RaisedButton(
              onPressed: () {
                // This gives the back button:
                Navigator.of(context).pushNamed('/login');

                // This doesn't give the back button (it replaces)
                //Navigator.pushReplacementNamed(context, '/login');
              },
              child: Text('Login'),
            ),
          ],
        ),
      ),
    );
  }
}

class Login extends StatefulWidget {
  @override
  _LoginState createState() => _LoginState();
}

class _LoginState extends State<Login> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('Login Page'),
        ),
        body: Center(
          child: RaisedButton(
            onPressed: () {
              // This will only work for pushNamed
              Navigator.of(context).pop();
            },
            child: Text('Go back'),
          ),
        ));
  }
}

您可以嘗試使用以下代碼

Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => YourNextScreen())),

我找到了一個很好的教程,我一直跟着,它非常全面,有截圖和一步一步,你也可以下載代碼並運行它。 對我學習 Flutter 非常有幫助,尤其是我完全是初學者。

https://medium.com/@misterflutter/lesson-5-creating-new-screens-f740994190c7

https://medium.com/@misterflutter/lesson-6-creating-new-screens-part-2-4997085a43af?sk=d2a0fb723af42b78800f7cf19b312b62

使用新的Get 插件,您只需調用即可導航到新頁面

Get.to(Page());

In formal method :

Navigator.push(context, MaterialPageRoute(builder: (context)=>Second()));

在 GetX 方法中:

Get.to(Second());

如果我們可以將屏幕導航到另一個頁面並從堆棧中刪除當前頁面,那么我們可以使用下面定義的方法:

Get.off(Third());

如果我們可以將屏幕導航到另一個頁面並從堆棧中刪除所有路由或頁面,那么我們可以使用下面定義的方法:

Get.offAll(Third());

如果我們想使用 Navigator.pop() 那么 GetX 給出一個方法,定義如下:

Get.back();

Flutter 有一個類似的實現,使用NavigatorRoutes 路由是應用程序“屏幕”或“頁面”的抽象,導航器是管理路由的小部件。

要在頁面之間導航,您有幾個選項:

  • 指定路線名稱的地圖。
  • 直接導航到路線。

以下示例構建了一個 Map。

void main() {
  runApp(CupertinoApp(
    home: MyAppHome(), // becomes the route named '/'
    routes: <String, WidgetBuilder> {
      '/a': (BuildContext context) => MyPage(title: 'page A'),
      '/b': (BuildContext context) => MyPage(title: 'page B'),
      '/c': (BuildContext context) => MyPage(title: 'page C'),
    },
  ));
}

通過pushing其名稱pushing送到導航器來導航到route

Navigator.of(context).pushNamed('/b');

Navigator類處理 Flutter 中的路由,並用於從您推送到堆棧上的路由中獲取返回結果。 這是通過awaiting push()返回的Future來完成的。

例如,要開始一個讓用戶選擇他們位置的“位置”路線,您可以執行以下操作:

Map coordinates = await Navigator.of(context).pushNamed('/location');

然后,在您的“位置”路線中,一旦用戶選擇了他們的位置,就用結果pop()堆棧:

Navigator.of(context).pop({"lat":43.821757,"long":-79.226392});

您可以在構建小部件中使用這種方式

onTap: () { Navigator.of(context).push(MaterialPageRoute( builder: (context) => NewScreen()));},

這樣您就可以呈現下一個屏幕

Navigator.of(context).push(
   MaterialPageRoute(fullscreenDialog: true,
   builder: (context) => const NewScreen(),
   ),
);
FloatingActionButton(
  onPressed: (){
    Navigator.of(context).push(MaterialPageRoute(builder: (context) => const AddUser()));
  },
  child: const Icon(Icons.add),
),

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM