这是代码:
主要
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider<Something>(
create: (_) => Something(),
child: Consumer<Something>(
builder: (BuildContext context, Something value, Widget child) {
return MaterialApp(
title: 'Flutter Demo',
home: MyHomePage(),
);
},
),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key}) : super(key: key);
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
String mockData = '';
@override
void initState() {
super.initState();
initData();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'moceData:$mockData',
),
Text(
'${Provider.of<Something>(context).count}',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
Navigator.push(context, MaterialPageRoute(builder: (_) {
return SecondPage();
}));
},
child: Icon(Icons.add),
),
);
}
initData() {
Future.delayed(Duration(seconds: 1), () {
mockData = 'mock 123';
setState(() {});
});
}
}
第二页
class SecondPage extends StatefulWidget {
@override
_SecondPageState createState() => _SecondPageState();
}
class _SecondPageState extends State<SecondPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
child: Center(
child: GestureDetector(
onTap: () {
Provider.of<Something>(context, listen: false).doSomething();
},
child: Text('click'),
),
),
),
);
}
}
某事
class Something extends ChangeNotifier {
var count =0;
void doSomething() {
print('doSomething');
count++;
notifyListeners();
}
}
当我们打开此应用程序时,MyHomePage在initState中请求数据,
当我们按下secondPage时,我们单击“单击” btn,我们希望第一页检索数据(iniData())。
当我们单击时,会调用notifiyListeners()和_MyHomePageState build(),但不会调用initState(),所以
怎么办?我们可以再次调用initData。
类似情况: 1.我们在其他页面上更改了语言。主页上的数据需要重新请求响应的语言界面。 2.用户成功登录后,刷新用户库存,库存页面已经存在
答案 0 :(得分:0)
尝试一下:
setState(() {
mockData = 'mock 123';
});
但是在这里,您并没有初始化数据以便与Provider一起使用,如果您希望通过Provider获取数据(我的意思是mockData var),则可以这样做:
在Something类中添加以下内容:
String mockData="123";
String get mockdata => mockData;
,然后在主页中使用提供者访问此数据:
Provider.of<Something>(context, listen:false).mockdata;
我希望我能帮助您..祝您好运!
答案 1 :(得分:0)
对不起,也许我对问题的描述不够清楚,但是现在我找到了解决方案。 使用
ChangeNotifierProxyProvider<Foo, MyChangeNotifier>(
create: (_) => MyChangeNotifier(),
update: (_, foo, myNotifier) => myNotifier
..foo = foo,
child: ...
);
///一个[ChangeNotifierProvider],用于构建和同步[ChangeNotifier] ///从其他提供程序获取的值。 谢谢