[英]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.