flutter - flutter 中的全局 snackbar/dialog utils 类

标签 flutter

我想创建一个 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/

相关文章:

flutter - 收集用户输入数据- flutter

linux - flutter_webview_plugin 不断加载

android - 如何从我的 Flutter 应用程序控制网络缓存?

android - 任务 ':app:desugarDebugFileDependencies' 执行失败

dart - 将 "uint8list"的字符串转换为 Unit8List

flutter - 如何将文本与 RadioListTile 对齐

android-studio - 如何在 flutter 中弹出小部件之前从小部件传递日期?

android - Flutter 在运行测试应用程序时出错

unit-testing - Flutter/Dart 在单元测试中等待几秒钟

flutter - 如何将PX值转换为flutter字体大小