我正在尝试找到通过 Snackbar 显示带有 Provider 的 Change Notifier Model 错误的最佳方法。
是否有任何内置方法或任何建议可以帮助我?
我发现这种方式有效,但我不知道它是否正确。
假设我有一个简单的页面,我想在其中显示一个对象列表和一个从 api 检索这些对象的模型。如果出现错误,我会通知一个错误字符串,并且我想用 SnackBar 显示该错误。
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class Page extends StatefulWidget {
Page({Key key}) : super(key: key);
@override
_PageState createState() => _PageState();
}
class _PageState extends State< Page > {
@override
void initState(){
super.initState();
Provider.of<Model>(context, listen: false).load();
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
Provider.of< Model >(context, listen: false).addListener(_listenForErrors);
}
@override
Widget build(BuildContext context){
super.build(context);
return Scaffold(
appBar: AppBar(),
body: Consumer<Model>(
builder: (context, model, child){
if(model.elements != …Run Code Online (Sandbox Code Playgroud) 我正在尝试跨两条路线共享同一个块。但是,当我从第二条路线回来时,该块会自动处理,因此在第一条路线中,我发现自己所有的流都关闭了。
例如,这是我实例化块的第一条路线(主页),从 api 下载列表并在构建方法中显示它。
class HomePage extends StatefulWidget {
@override
State<StatefulWidget> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
GroupsBloc _groupBloc;
@override
void initState() {
super.initState();
}
@override
void didChangeDependencies(){
super.didChangeDependencies();
_groupBloc = GroupsBloc();
_groupBloc.getAll();
}
@override
void dispose(){
_groupBloc.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
然后我导航到第二个屏幕,可以在其中将项目添加到列表中。
_onAddGroupPress(){
Navigator.of(context).push(new MaterialPageRoute(
builder: (BuildContext context) => BlocProvider<GroupsBloc>(bloc: _groupBloc, child: GroupPage()),
fullscreenDialog: true
),
);
}
Run Code Online (Sandbox Code Playgroud)
在第二个屏幕中,我检索该块并使用它来添加项目,然后返回主页。
class GroupPage extends StatefulWidget {
@override
_GroupPageState createState() => _GroupPageState();
} …Run Code Online (Sandbox Code Playgroud)