颤振 notifyListeners 似乎不起作用

Posted

技术标签:

【中文标题】颤振 notifyListeners 似乎不起作用【英文标题】:Flutter notifyListeners seems not working 【发布时间】:2021-12-29 18:51:48 【问题描述】:

我有一个 TextField,我在其中显示一个值。 然后我有一个 FAB,它允许我通过 AlertDialog 向 SQFlite 数据库添加一个值。 当我单击 TextField 上的添加值按钮时,它没有得到更新,我必须重新打开应用程序才能看到更改。 为什么? 我做错了吗? 我的代码: 在 DBHelper 类中,添加值和读取所有值的方法(有效)

Future create(Bmi bmi) async 
    final db = await instance.database;

    final id = await db.insert(tableBmi, bmi.toJson());
    log(bmi.toString());
    return bmi.copy(id: id);
  

Future<List<Bmi>> readAllBmi() async 
    final db = await instance.database;

    final orderBy = '$BmiFields.dateTime DESC';
    final result = await db.query(tableBmi, orderBy: orderBy);
    return result.map((json) => Bmi.fromJson(json)).toList();
  

BmiListViewModel 中要添加和读取的方法

List<BmiViewModel> bmiVm = [];

  void readAllBmi() async 
    List<Bmi> bmiList = await DbHelper.instance.readAllBmi();
    loadingStatus = BmiLoadingStatus.loading;
    notifyListeners();
    this.bmiVm = bmiList.map((bmi) => BmiViewModel(bmi: bmi)).toList();
    if (this.bmiVm.isEmpty) 
      this.loadingStatus = BmiLoadingStatus.completed;
     else 
      this.loadingStatus = BmiLoadingStatus.completed;
    
    notifyListeners();
  

  addNewBmi(Bmi bmi) async 
    log(bmi.value);
    await DbHelper.instance.create(bmi);
    notifyListeners();
  

Main.dart

return MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (_) => BmiListViewModel()),
      ],
      child: MaterialApp(
        title: 'BodyM',
        theme: ThemeData(
            canvasColor: Color(0xFF1C1C1E),
            primarySwatch: Colors.blue,
            textTheme:
            GoogleFonts.interTextTheme(Theme.of(context).textTheme)),
        initialRoute: '/',
        routes: routes,
      ),
    );

要添加的文本按钮

TextButton(
          child: Text("Add", style: TextStyle(color: Colors.green)),
          onPressed: () async 
            //here i create my bmi object
              await Provider.of<BmiListViewModel>(context, listen: false).addNewBmi(bmi);
             else 
              //TODO
            
          ,
        ),

包含用于显示值的 Text 小部件的容器

child: Container(
        child: Padding(
          padding: EdgeInsets.all(20.0),
          child: Row(
            children: [
              if(bmiVm.toString() == '[]')
                Text('N/A', style: TextStyle(color:Colors.white, fontSize: 80))
              else
                Text(bmiVm[0].valueBmi, style: TextStyle(color:Colors.white, fontSize: 80))
            ],
          ),
        ),
      )

bmiVm 它是一个 List 在 build 方法之前创建。

解决方案:我解决了,只需在 addNewBmi 方法之后我必须调用 readAllBmi 方法来更新列表,然后 notifyListeners() 完成其余的工作。

【问题讨论】:

【参考方案1】:
TextButton(
      child: Text("Add", style: TextStyle(color: Colors.green)),
      onPressed: () async 
        //here i create my bmi object
          await Provider.of<BmiListViewModel>(context, listen: **true**).addNewBmi(bmi);
         else 
          //TODO
        
      ,
    ),

您必须监听状态变化才能更新 UI。

【讨论】:

你可以试试这个,重建整个小部件树,看看它是否给你预期的结果。它将重建从 MaterialApp 及以下开始的所有内容。然而,这似乎是一个矫枉过正。 NotifyListeners 应该可以解决问题。尝试在它们上设置调试点并找出它们不能正常工作的原因。

以上是关于颤振 notifyListeners 似乎不起作用的主要内容,如果未能解决你的问题,请参考以下文章

谷歌字体包在颤振中不起作用

颤振平面按钮颜色属性不起作用

颤振本地通知声音不起作用

颤振列表视图波纹效果不起作用

升级颤振后命令不起作用

颤振 |右对齐不起作用