【发布时间】:2020-10-19 15:11:03
【问题描述】:
我正在开发 Flutter Web 应用程序。
目标是为大部分路由屏幕重用相同的布局屏幕小部件(Drawer,AppBar)。
我已经尝试创建一个新的 Scaffold 类并将 body 小部件添加到每个屏幕。
问题是每次我导航到新屏幕时。在小部件树上创建了一个新的 (MyScaffold)。所以对性能不好。
我也尝试使用嵌套路由器,问题是嵌套路由器不受 url 支持,我无法通过输入 URL 导航到屏幕。
有没有其他合适的方法来处理这个问题。
谢谢
添加代码示例:
import 'package:flutter/material.dart';
void main() => runApp(AppWidget());
class AppWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
initialRoute: '/',
routes: {
'/': (context) => FirstScreen(),
'/second': (context) => SecondScreen(),
},
);
}
}
class FirstScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('First Screen'),
),
body: Center(
child: RaisedButton(
child: Text('Launch screen'),
onPressed: () {
Navigator.pushReplacementNamed(context, '/second');
},
),
),
);
}
}
class SecondScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Second Screen"),
),
body: Center(
child: RaisedButton(
onPressed: () {
Navigator.pushReplacementNamed(context, '/');
},
child: Text('Go back!'),
),
),
);
}
}
我会尝试更好地解释这个问题。
如您所见,First Screen 和 Second Screen 具有完全相同的小部件树结构。但是每次flutter都会删除Screen Widget并创建一个新的。
我还尝试更改代码以创建一个新的 MyScaffold 并重用相同的 Widget 类:
class AppWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
initialRoute: '/',
routes: {
'/': (context) => MyScallfold(
bodyWidget: FirstScreen(),
),
'/second': (context) => MyScallfold(
bodyWidget: SecondScreen(),
),
},
);
}
}
class FirstScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return RaisedButton(
onPressed: () {
Navigator.pushReplacementNamed(context, '/second');
},
child: Text('To Screen 2!'),
);
}
}
class SecondScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return RaisedButton(
onPressed: () {
Navigator.pushReplacementNamed(context, '/');
},
child: Text('To Screen 1!'),
);
}
}
class MyScallfold extends StatelessWidget {
Widget bodyWidget;
MyScallfold({this.bodyWidget});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('WebAppTest'),
),
body: bodyWidget,
);
}
}
我注意到每次使用导航时,树的所有小部件都会重新构建(renderObject #id 已更改)
那么是否可以在flutter中复用同一个RenderObject(AppBar、RichText)来优化性能?
【问题讨论】:
-
你在使用
Navigator.of(context).push(newRoute)吗?如果是这样,请尝试使用Navigator.of(context).pushReplacement(newRoute)。 -
否则,如果您使用相关代码扩展您的问题,这将非常有帮助。这样可以更轻松地为您提供帮助。
-
@josxha 感谢您的帮助,我正在添加代码示例并尝试更好地解释我的问题。
标签: flutter dart flutter-web