Flutter ViewModel 旧数据正在重新填充(使用 Provider)
Posted
技术标签:
【中文标题】Flutter ViewModel 旧数据正在重新填充(使用 Provider)【英文标题】:Flutter ViewModel old data is repopulating (using Provider) 【发布时间】:2022-01-04 14:58:28 【问题描述】:我正在使用 multiProvider 来管理 Flutter 中的状态。我面临的主要问题是; 关闭页面后无法清除 viewModel 中的数据。当我再次打开页面时,旧数据正在从 viewModel 中填充。
由于这个问题,我在 viewModel 中创建了一个“重置”方法,并在打开页面之前调用了这个“重置”方法。
有没有办法从 viewModel 中删除旧值:- 请建议
我的代码:
主页 在多提供者下添加提供者
class MyApp extends StatelessWidget
@override
Widget build(BuildContext context)
return MultiProvider(
providers: [
ChangeNotifierProvider.value(value: ViewModel1()),
ChangeNotifierProvider.value(value: ViewModel2()),
],
child: MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
),
//Set Home Page after splash
home: HomePage(),
)
);
这是我的主页导航到 FirstPage 并重置 ViewModel1 数据
HomePage()
:
:
:
onPressed()
Navigator.push(
context, MaterialPageRoute(builder: (context) => FirstPage()));
Provider.of<ViewModel1>(context, listen: false).reset();
这是我的页面:
class FirstPage extends StatefulWidget
@override
_FirstPageState createState() => _FirstPageState();
class _FirstPageState extends State<FirstPage>
@override
Widget build(BuildContext context)
final ViewModel1 _viewModel1 =
Provider.of<ViewModel1>(context, listen: true);
TextFormField(
controller: _fNameController,
onChanged: _viewModel1.setFname,
);
这是我的视图模型:
class ViewModel1 with ChangeNotifier
String _fName = '';
String get fName => _fName;
setFname(String fName)
_fName = fName;
notifyListeners();
setFnameValidation(fName
.trim()
.isNotEmpty ? true : false);
//TODO Reset all values
void reset()
_fName = '';
notifyListeners();
【问题讨论】:
【参考方案1】:如果您在不同页面上重用一个模型,而不在页面之间共享数据。最好在每个页面上创建和关闭模型。
【讨论】:
嗨,Kherel。感谢您的回答。如果您在每个页面上创建一个 ViewModel(构建方法),我认为如何在 initState() 中将 TextEditing 控制器与视图模型绑定;为此,我们必须创建一个单独的 'ViewModel1' 实例,例如:@override Widget build(BuildContext context) return Scaffold( appBar: AppBar( ), body: ChangeNotifierProvider( create: (BuildContext context) => viewModel,孩子:消费者(构建器:(context,viewModel,_)return Container()以上是关于Flutter ViewModel 旧数据正在重新填充(使用 Provider)的主要内容,如果未能解决你的问题,请参考以下文章
Flutter Bloc:更新后未调用 BlocBuilder,ListView 仍显示旧数据
简单聊聊Android和Flutter的ViewModel实现方案
简单聊聊Android和Flutter的ViewModel实现方案