首页 > 解决方案 > 在我的颤振应用程序中使用 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'),
    );
  }
}

以下是操作步骤:

  1. 单击第一页上的“更新状态”按钮。
  2. 将显示“转到第二页”按钮。
  3. 单击“转到第二页”按钮将导航到第二页。
  4. 然后单击第二页左上角的按钮返回第一页。

控制台将显示如下内容:

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 ..................

我的问题是:

  1. 第一个页面将在第二个页面构建之后再次构建。为什么?
  2. 而当我回到第一页时,第一页又会构建,这正常吗?

请帮我。

标签: dartflutter

解决方案


这是预期的行为。

构建小部件的次数不应该改变应用程序的行为,它至多是性能优化。

如果这导致您出现任何问题,那么您可能在方法内部做错了什么build。在这种情况下,您可能需要阅读如何处理不需要的小部件构建?


推荐阅读