我对 Flutter Provider 模式有疑问。用户重定向到新屏幕后,找不到提供程序。
按照我之前的问题(在此小部件上方找不到正确的提供者),我编写了以下代码:
class NewRoute extends StatelessWidget {
@override
Widget build(BuildContext context) {
final title = 'Tap to select';
return MaterialApp(
title: title,
home: Scaffold(
appBar: AppBar(
title: Text(title),
),
body: NewRouteBody()
));
}
}
class NewRouteBody extends StatelessWidget {
@override
Widget build(BuildContext context) {
var user = Provider.of<UserRepository>(context);
return ListView(...)
Run Code Online (Sandbox Code Playgroud)
我做了同样的事情,但我再次收到错误消息,指出它无法在此小部件 ( NewRouteBody)上方找到正确的提供程序。
试图以某种方式修复它,在谷歌上搜索了几个小时的答案但没有成功......
任何帮助表示赞赏。
编辑
这是UserRepository其中包含模式:
class UserRepository with ChangeNotifier {
User user;
Status _status = Status.Uninitialized;
Status get status => …Run Code Online (Sandbox Code Playgroud) 我正在Flutter Bloc一个项目中使用。
这是结构:
MultiBlocProvider(
providers: [
BlocProvider<BlocA>(
create: (context) {
return BlocA()
..add(FetchEvent());
},
),
BlocProvider<BlocC>(
create: (context) {
return BlocC()..add(FetchEvent());
},
),
],
child: IndexedStack(
index: _pageNum,
children: [
ChildA(),
ChildB(),
],
),
)
Run Code Online (Sandbox Code Playgroud)
里面ChildB我有 aNavigator.push()到 a ChildC,BlocC正在使用 ( BlocConsumer),但我收到错误,
Flutter could not find the correct Provider above BlocConsumer<BlocC> Widget
Run Code Online (Sandbox Code Playgroud)
编辑
有一个按钮可以在按下时ChildB导航到。ChildC喜欢,
TextButton( // this code exists inside a scaffold widget
child: Text("Page C"),
onPressed: …Run Code Online (Sandbox Code Playgroud) 我无法访问推送到当前导航器的小部件中的提供程序:
import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
import 'package:provider/provider.dart';
void main() => runApp(MyApp());
class MyModel with ChangeNotifier {
String a = 'Test1';
String b = 'Test2';
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: ChangeNotifierProvider(
create: (context) => MyModel(),
child: MyHomePage()
)
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key}) : super(key: key);
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Consumer<MyModel>( …Run Code Online (Sandbox Code Playgroud) 我想要一个“设置”屏幕,我可以在其中选择要返回到第一个屏幕的颜色。
当“设置”屏幕关闭时,我无法更新第一个屏幕。
我使用提供程序作为更改通知程序。但我看不到如何触发第一个屏幕的更新。第三个按钮创建一个更新屏幕的事件,但这可以自动完成吗?
我错过了什么...?
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
void main() => runApp(MyApp());
Color bgColor = Colors.yellow[100];
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(home: MyHomeScreen());
}
}
class MyHomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider(create: (context) => ColorModel()),
],
child: Consumer<ColorModel>(builder: (context, colorModel, child) {
return Scaffold(
appBar: AppBar(title: Text('Thanks for your help :)')),
body: Container(
constraints: BoxConstraints.expand(),
color: bgColor,
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Text('Change background color …Run Code Online (Sandbox Code Playgroud)