Flutter错误通知插件error_notifier_for_provider的使用

Flutter错误通知插件error_notifier_for_provider的使用

error_notifier_for_provider 是一个用于在 ChangeNotifier/ValueNotifier/StateNotifier 中通知错误的小技巧。它不再需要使用 GlobalKey<Scaffold>

Provider(
  create: (_) => YourObjectWithErrorNotifierMixin(),
  child: Scaffold(
    body: ErrorListener(
      onNotify: (context, message) => Scaffold.of(context).showSnackBar(
        SnackBar(content: Text(message))
      ),
      child: YourContent(),
    ),
  ),
);

优点

  • 易于使用
  • 可以与 ChangeNotifier/ValueNotifier/StateNotifier 和任何其他提供对象一起使用。

动机

ChangeNotifier/ValueNotifier/StateNotifier 可以通知并反映其状态到其他对象,但它们主要用于UI更新,而不是一次性通知,例如错误通知。

error_notifier_for_provider 提供了另一种路径来通知某些事件。

完整示例Demo

以下是一个完整的示例,展示了如何使用 error_notifier_for_provider 插件:

import 'package:error_notifier_for_provider/error_notifier_for_provider.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePageNotifier extends ChangeNotifier with ErrorNotifierMixin {
  bool loading = false;

  void load() async {
    try {
      loading = true;
      notifyListeners(); // 通知加载开始
      await _tryToLoadAndFail();
    } on Exception catch (e) {
      notifyError(e.toString()); // 通知错误信息
    } finally {
      loading = false;
      notifyListeners(); // 通知加载结束
    }
  }

  Future<void> _tryToLoadAndFail() {
    return Future.delayed(
      Duration(seconds: 2),
      () => throw Exception("Error occurs!!!"), // 模拟加载失败
    );
  }
}

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      create: (_) => MyHomePageNotifier(),
      child: Scaffold(
        appBar: AppBar(
          title: Text("Error Notifier for Provider Example"),
        ),
        body: ErrorListener<MyHomePageNotifier>(
          onNotify: (context, message) {
            Scaffold.of(context).showSnackBar(SnackBar(
              content: Text(message),
              action: SnackBarAction(
                label: "RETRY",
                onPressed: () {
                  context.read<MyHomePageNotifier>().load(); // 重新加载
                },
              ),
            ));
          },
          child: Center(
            child: Selector<MyHomePageNotifier, bool>(
              selector: (context, notifier) => notifier.loading,
              builder: (context, loading, _) {
                if (loading) {
                  return CircularProgressIndicator(); // 显示加载指示器
                } else {
                  return Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      RaisedButton(
                        child: Text("LOAD"),
                        onPressed: () {
                          context.read<MyHomePageNotifier>().load(); // 开始加载
                        },
                      ),
                      Text("Loading will fail after 2 seconds 😢"), // 提示加载将在2秒后失败
                    ],
                  );
                }
              },
            ),
          ),
        ),
      ),
    );
  }
}

更多关于Flutter错误通知插件error_notifier_for_provider的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter错误通知插件error_notifier_for_provider的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,关于Flutter中的error_notifier_for_provider插件的使用,这里是一个简单的代码示例来展示如何集成和使用这个插件来处理错误通知。

首先,确保你已经在pubspec.yaml文件中添加了error_notifier_for_provider依赖:

dependencies:
  flutter:
    sdk: flutter
  provider: ^6.0.0 # 确保provider版本兼容
  error_notifier_for_provider: ^最新版本号 # 替换为最新版本号

然后运行flutter pub get来安装依赖。

接下来,我们来看一个简单的例子,展示如何使用ErrorNotifierProvider来处理错误通知。

1. 创建一个错误通知模型

首先,我们需要一个错误通知模型来存储错误信息:

import 'package:error_notifier_for_provider/error_notifier_for_provider.dart';

class MyErrorNotifier extends ErrorNotifier {
  MyErrorNotifier() : super();
}

2. 使用ErrorNotifierProvider包裹你的应用或特定部分

接下来,在你的应用中使用ErrorNotifierProvider来提供错误通知服务:

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:error_notifier_for_provider/error_notifier_for_provider.dart';
import 'my_error_notifier.dart'; // 导入你创建的错误通知模型

void main() {
  runApp(
    MultiProvider(
      providers: [
        ChangeNotifierProvider<MyErrorNotifier>(
          create: (_) => MyErrorNotifier(),
        ),
        ErrorNotifierProvider<MyErrorNotifier>(
          notifier: (ref) => ref.watch<MyErrorNotifier>(),
        ),
      ],
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Error Notifier Example'),
        ),
        body: Center(
          child: MyWidget(),
        ),
      ),
    );
  }
}

3. 在你的Widget中使用错误通知

现在,你可以在你的Widget中使用ErrorNotifier来处理错误通知:

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:error_notifier_for_provider/error_notifier_for_provider.dart';

class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final MyErrorNotifier errorNotifier = context.read<MyErrorNotifier>();
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        ElevatedButton(
          onPressed: () {
            // 模拟一个错误
            errorNotifier.addError('Something went wrong!');
          },
          child: Text('Trigger Error'),
        ),
        if (errorNotifier.hasErrors)
          ErrorWidget(
            errorNotifier: errorNotifier,
          ),
      ],
    );
  }
}

class ErrorWidget extends ConsumerWidget {
  final MyErrorNotifier errorNotifier;

  ErrorWidget({required this.errorNotifier});

  @override
  Widget buildWithProvider(BuildContext context, WidgetRef ref) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.center,
      children: [
        Text(
          'Error:',
          style: TextStyle(color: Colors.red),
        ),
        Text(
          errorNotifier.errors.join('\n'),
          style: TextStyle(color: Colors.red),
        ),
        ElevatedButton(
          onPressed: () {
            // 清除错误
            errorNotifier.clearErrors();
          },
          child: Text('Clear Error'),
        ),
      ],
    );
  }
}

在这个例子中,我们创建了一个简单的错误通知系统,通过点击按钮触发错误,并在UI上显示错误信息。点击“Clear Error”按钮可以清除错误信息。

这个示例展示了如何使用error_notifier_for_provider插件来管理和显示错误通知。根据你的具体需求,你可以进一步扩展和自定义这个系统。

回到顶部