簡體   English   中英

如何從 Flutter 中的流中顯示 Snackbar?

[英]How to show a Snackbar from a Stream in Flutter?

一旦Stream of String發送一個新String我想顯示一個SnackBar

我試圖在StatefulWidget放置一個StreamBuilder ,以便能夠調用Scaffold.of() (因為它現在是另一個context )。 但后來我收到了這個錯誤:

以下斷言在構建 StreamBuilder(dirty, state: _StreamBuilderBaseState>#7f258): setState() 或 markNeedsBuild() 時被拋出。 無法將此 Scaffold 小部件標記為需要構建,因為該框架已在構建小部件的過程中。 僅當其祖先之一當前正在構建時,才可以將小部件標記為需要在構建階段構建。 允許此異常是因為框架在子級之前構建父級小部件,這意味着將始終構建臟后代。 否則,框架可能不會在此構建階段訪問此小部件。 調用 setState() 或 markNeedsBuild() 的小部件是: Scaffold(dependencies: [_LocalizationsScope-[GlobalKey#0e1f6], Directionality, _InheritedTheme, MediaQuery], state: ScaffoldState#3f2aa(tickers: tracking 2 tickers)) 小部件當前正在構建的有問題的調用是:StreamBuilder(dirty, state: _StreamBuilderBaseState>#7f258)

我該如何解決這個問題?

這是一個顯示問題的簡單代碼片段:

import 'dart:async';

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: TestHome(),
    );
  }
}

class TestHome extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: StreamSnackbar(),
    );
  }
}

class StreamSnackbar extends StatefulWidget {
  @override
  _StreamSnackbarState createState() => _StreamSnackbarState();
}

class _StreamSnackbarState extends State<StreamSnackbar> {
  final status = StreamController<String>();

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            RaisedButton(
              onPressed: () {
                status.add('Test');
              },
              child: Text('Press me to trigger the Snackbar!'),
            ),
            StreamBuilder<String>(
              stream: status.stream,
              builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
                if (snapshot.hasData) {
                  Scaffold.of(context)
                      .showSnackBar(SnackBar(content: Text(snapshot.data)));
                }
                return Container(
                  height: 0,
                  width: 0,
                ); // just because we need to return a Widget
              },
            ),
          ],
        ),
      ),
    );
  }
}

無需使用StreamBuilder 無論如何,顯示SnackBar必須在 sync build()執行之外完成。

@override
void initState() {
  super.initState();
  status.stream.forEach((e) =>
    Scaffold.of(context)
        .showSnackBar(SnackBar(content: Text(e))));
}

@override
void dispose() {
  status.close();
  super.dispose();
}

暫無
暫無

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

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