我想创建一个 GlobalMessageUtils
类,无需传递构建上下文即可打开 Material snackbar 或对话框。这个想法是,每当出现任何错误(无网络、错误请求等)时,我都可以弹出一个 snackbar 并将消息转发给用户。是否有全局 context
的概念?
我的想法是让我的 GlobalMessageUtils
类成为一个单例,它接受构建 context
并在 MaterialApp
级别实例化它,但我还没有让它工作。任何机构有任何想法?这甚至是 flutter 中的一个好模式吗?如果不是,你们如何处理全局级别的错误处理?
最佳答案
使用 BLOC 模式和 Rxdart,我创建了一个 UiErrorUtils
类
class UiErrorUtils {
// opens snackbar
void openSnackBar(BuildContext context, String message) async {
await Scaffold.of(context).showSnackBar(
SnackBar(
content: Text(message),
),
);
}
// subscribes to stream that triggers open snackbar
void subscribeToSnackBarStream(BuildContext context, PublishSubject<String> stream){
stream.listen((String message){
openSnackBar(context, message);
});
}
}
在您的 StatefulWidget 中,您可以使用 initState
Hook 中提供的上下文:
class WidgetThatUsesUIErrorUtils extends StatefulWidget {
final UiErrorUtils uiErrorUtils;
final Bloc bloc;
WidgetThatUsesUIErrorUtils({this.uiErrorUtils, this.bloc});
WidgetThatUsesUIErrorUtils createState() => WidgetThatUsesUIErrorUtilsState(
uiErrorUtils: uiErrorUtils,
bloc: bloc,
);
}
class WidgetThatUsesUIErrorUtilsState extends State<WidgetThatUsesUIErrorUtils> {
final Bloc _bloc;
final UiErrorUtils _uiErrorUtils;
WidgetThatUsesUIErrorUtilsState({Bloc bloc, UiErrorUtils uiErrorUtils})
: _bloc = bloc ?? Bloc(),
_uiErrorUtils = uiErrorUtils ?? UiErrorUtils();
@override
void initState() {
super.initState();
// Subscribe to UI feedback streams from provided _bloc
_uiErrorUtils.subscribeToSnackBarStream(context, _bloc.snackBarSubject);
}
}
Bloc
class Bloc extends BlocBase {
// UI Feedback Subjects
final PublishSubject<String> snackBarSubject = PublishSubject<String>();
// some function that gets data from network
Future<bool> getDataRequest() async {
try {
// get request code here
} catch(error) {
this.snackBarSubject.add(error);
}
}
@override
void dispose() {
snackBarSubject?.close();
}
}
现在您的小部件已经订阅了 bloc 的 snackBarStream。
因此,在您的 Bloc 中,每当请求失败时,您都可以将消息添加到 snackBarStream,并且由于您的小部件已通过 UiErrorUtils
订阅,因此 snackbar 将触发消息。
关于flutter - flutter 中的全局 snackbar/dialog utils 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55083215/