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 仍显示旧数据

Flutter 在更新时删除 Hive 数据库

简单聊聊Android和Flutter的ViewModel实现方案

简单聊聊Android和Flutter的ViewModel实现方案

简单聊聊Android和Flutter的ViewModel实现方案

简单聊聊Android和Flutter的ViewModel实现方案