首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Flutter w/ MobX:出现异常时,Snackbar不显示

Flutter是一种跨平台的移动应用开发框架,而MobX是一种状态管理库。当在Flutter应用中使用MobX时,如果出现异常,Snackbar通常不会显示。这是因为MobX默认会捕获并处理异常,以避免应用崩溃。

要解决这个问题,可以通过在异常处理代码中手动显示Snackbar来实现。以下是一个示例代码:

代码语言:txt
复制
import 'package:flutter/material.dart';
import 'package:mobx/mobx.dart';

// 创建一个全局的异常处理器
final globalErrorHandler = (Object error, StackTrace stackTrace) {
  // 在这里显示Snackbar
  ScaffoldMessenger.of(context).showSnackBar(
    SnackBar(
      content: Text('出现异常:$error'),
    ),
  );
};

void main() {
  // 初始化MobX
  WidgetsFlutterBinding.ensureInitialized();
  // 设置全局异常处理器
  FlutterError.onError = globalErrorHandler;

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter w/ MobX',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  final counter = Observable(0);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter w/ MobX'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              '点击按钮增加计数器的值:',
            ),
            Observer(
              builder: (_) => Text(
                '${counter.value}',
                style: Theme.of(context).textTheme.headline4,
              ),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 在这里故意引发一个异常
          throw Exception('这是一个故意引发的异常');
        },
        child: Icon(Icons.add),
      ),
    );
  }
}

在上面的示例中,我们创建了一个全局的异常处理器globalErrorHandler,它会在应用中的任何地方捕获异常。然后,在main()函数中设置FlutterError.onErrorglobalErrorHandler,以确保所有异常都会被捕获和处理。

MyHomePage组件中,我们使用了MobX来管理计数器的状态。当点击FloatingActionButton时,故意引发一个异常。由于我们设置了全局异常处理器,异常会被捕获并显示Snackbar。

需要注意的是,Snackbar需要在有Scaffold的上下文中才能正常显示,因此我们使用ScaffoldMessenger.of(context)来获取ScaffoldMessengerState,并调用showSnackBar()来显示Snackbar。

这是一个简单的解决方案,可以根据实际需求进行修改和扩展。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的合辑

领券