dart - 在我的颤振应用程序中使用 StreamBuilder 和 Navigator,但第一页构建了两次
问题描述
伙计们。我正在使用 StreamBuilder 处理异步数据。
这是一个演示,第一页上有一个按钮,单击该按钮将导航到第二页。完整代码如下。
import 'package:flutter/material.dart';
import 'dart:async' show StreamController;
void main() {
runApp(
new MaterialApp(
title: 'First Page',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new FirstPage(),
),
);
}
class FirstPage extends StatelessWidget {
final StreamController<String> _streamController = StreamController<String>();
@override
Widget build(BuildContext context) {
print('first page start to build ..................');
StreamBuilder builder = new StreamBuilder(
stream: _streamController.stream,
builder: (context, asyncSnapshot) {
if (asyncSnapshot.hasData) {
print('first page data returned ..................');
return RaisedButton(
child: Text('go to the second page'),
onPressed: () {
print('navigate to second page ..................');
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondPage()),
);
},
);
} else {
return Text('waitting to update');
}
});
return new Scaffold(
appBar: new AppBar(
title: new Text('First Page'),
),
body: Column(
children: <Widget>[
RaisedButton(
child: Text('update state'),
onPressed: () {
_streamController.add('hello world');
},
),
builder,
],
),
);
}
dispose() {
_streamController.close();
}
}
class SecondPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
print('second page start to build ..................');
return new Scaffold(
appBar: new AppBar(
title: new Text('Second Page'),
),
body: Text('this is second page'),
);
}
}
以下是操作步骤:
- 单击第一页上的“更新状态”按钮。
- 将显示“转到第二页”按钮。
- 单击“转到第二页”按钮将导航到第二页。
- 然后单击第二页左上角的按钮返回第一页。
控制台将显示如下内容:
I/flutter ( 3674): first page start to build ..................
Reloaded 1 of 487 libraries in 1,734ms.
I/flutter ( 3674): first page data returned ..................
I/flutter ( 3674): navigate to second page ..................
I/flutter ( 3674): second page start to build ..................
I/flutter ( 3674): first page data returned ..................
I/flutter ( 3674): first page data returned ..................
我的问题是:
- 第一个页面将在第二个页面构建之后再次构建。为什么?
- 而当我回到第一页时,第一页又会构建,这正常吗?
请帮我。
解决方案
这是预期的行为。
构建小部件的次数不应该改变应用程序的行为,它至多是性能优化。
如果这导致您出现任何问题,那么您可能在方法内部做错了什么build
。在这种情况下,您可能需要阅读如何处理不需要的小部件构建?
推荐阅读
- azure - ADF 中的行到列
- c# - 基于条件语句 C# 的动态执行代码的方式
- swiftui - 在 NavigationView 中加载视图的标准方法是什么,每个视图都拥有一个从 API 填充的模型?
- sql - 您如何选择最新日期的值?
- javascript - VueJs Nuxt 中的 root () 元素样式
- c++ - 为什么代码在代码块 16.01 中可以工作,但最新版本的 Clion 不能
- reactjs - 键入'调度
' 缺少来自类型 'IAuthContext' 的以下属性:类型、有效负载 - python - Python pandas,准确查看列中的值
- c++ - 在 C++ 项目上使用 C 库会给出“未定义的引用”
- git - Mac:git 坏了 - 凭证问题