gpt4 book ai didi

android - Flutter 应用程序中每个页面的多个脚手架

转载 作者:行者123 更新时间:2023-12-04 23:36:06 25 4
gpt4 key购买 nike

API 文档:https://api.flutter.dev/flutter/material/Scaffold-class.html说:

The Scaffold was designed to be the single top level container for a MaterialApp and it's typically not necessary to nest scaffolds. For example in a tabbed UI, where the bottomNavigationBar is a TabBar and the body is a TabBarView, you might be tempted to make each tab bar view a scaffold with a differently titled AppBar. It would be better to add a listener to the TabController that updates the AppBar.



这是否意味着Material App下只需要一个Scaffold或每个页面只有一个父Scaffold。如果是第一个,我们如何导航?如果是以后,那不就是常见的 AppBar吗?和 BottomBar在每个导航上重新渲染?什么是最佳做法。

最佳答案

这意味着,通常应该有一个 Scaffold对于每个页面(更准确地说,对于每个 Route/screen),并且您不应该嵌套 Scaffold s。

在屏幕之间导航

例如,看一下可以在 DartPad 中运行的代码段。 :

import 'package:flutter/material.dart';

void main() {
runApp(MaterialApp(
title: 'Navigation Basics',
home: FirstRoute(),
));
}

class FirstRoute extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('First Route'),
),
body: Center(
child: RaisedButton(
child: Text('Open route'),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondRoute()),
);
},
),
),
);
}
}

class SecondRoute extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Second Route"),
),
body: Center(
child: RaisedButton(
onPressed: () {
Navigator.pop(context);
},
child: Text('Go back!'),
),
),
);
}
}

在这里,您可以看到有两个不同的页面/ Route s/screens,每个都有自己的 Scaffold .我们使用 Navigator 来回导航。 ,所以我们的页面被添加到堆栈中,一个 Scaffold在另一个之上。那也行。

If the it's later, doesn't it mean the common AppBar and BottomBar get re-rendered on each navigation?



是的,但是当我们制作两个单独的屏幕时,这正是我们想要的,每个屏幕都有自己的 Scaffold .

在 Scaffold/嵌套导航的主体内导航

另一方面,看看这个例子:

import 'package:flutter/material.dart';

void main() {
runApp(MaterialApp(
title: 'Navigation Basics',
home: FirstRoute(),
));
}

class FirstRoute extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('First Route'),
),
body: Scaffold(
body: Center(
child: RaisedButton(
child: Text('Open route'),
onPressed: () {},
),
),
),
);
}
}

在这里,我们嵌套了两个 Scaffold s,如您所见,第二个应用栏被绘制在第一个应用栏下方。这不是选项卡式或嵌套导航的最佳方法。如果您想在 Scaffold 的正文中导航,并根据内容更改应用栏,使用 TabControllers ,如 DefaultTabController , 是首选。看看这个例子:

import 'package:flutter/material.dart';

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

class TabBarDemo extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: DefaultTabController(
length: 3,
child: Scaffold(
appBar: AppBar(
bottom: TabBar(
tabs: [
Tab(icon: Icon(Icons.directions_car)),
Tab(icon: Icon(Icons.directions_transit)),
Tab(icon: Icon(Icons.directions_bike)),
],
),
title: Text('Tabs Demo'),
),
body: TabBarView(
children: [
Icon(Icons.directions_car),
Icon(Icons.directions_transit),
Icon(Icons.directions_bike),
],
),
),
),
);
}
}

如您所见,我们只使用了一个 Scaffold ,因为我们只处理一个屏幕,真的。碰巧我们想要显示内容页面并在 Scaffold 的正文中导航。 .

结论

作为一般经验法则:仅使用一个 Scaffold根据 Route/屏幕。仅使用一个 Scaffold带有 TabController 等小部件或 IndexedStack导航单个屏幕正文内的内容。

关于android - Flutter 应用程序中每个页面的多个脚手架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60561552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com