Обновление: Возникла проблема с кодом, которым я поделился. Пожалуйста, проверьте это.
Прежде всего, всегда создавайте свой SnackBar вне FutureBuilder, потому что FutureBuilder постоянно вызывается, поэтому он вызывает бесконечное l oop. Что вы можете сделать, это использовать catchError. Вы все еще можете проверить, есть ли активный SnackBar, прежде чем создавать новый, используя переменную, которую мы уже объявили.
Вы увидите, что SnackBar будет отображаться только один раз, хотя я трижды вызывал его при запуске код ниже.
Примените тот же способ, чтобы обновить свой собственный код:
class App extends StatefulWidget {
@override
_AppState createState() => _AppState();
}
class _AppState extends State<App> {
bool snackBarActive = false;
Future<String> futureDetail;
@override
void initState() {
futureDetail = Future<String>.error('An error Occurred').catchError((errText) {
showSnackBar(errText);
showSnackBar(errText);
showSnackBar(errText);
});
super.initState();
}
void showSnackBar(String errText) {
if (!snackBarActive) {
setState(() {
snackBarActive = true;
});
WidgetsBinding.instance.addPostFrameCallback((_) => Scaffold.of(context)
.showSnackBar(SnackBar(
content: Text(errText),
))
.closed
.whenComplete(() {
setState(() {
snackBarActive = false;
});
}));
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: SingleChildScrollView(
child: FutureBuilder(
future: futureDetail,
builder: (context, AsyncSnapshot<String> snapshot) {
if (!snapshot.hasError &&
snapshot.hasData &&
snapshot.data != null) {
return Container();
} else {
return Center(
child: Text('failed to load'),
);
}
},
),
),
),
);
}
}