【问题标题】:Flutter notifyListeners seems not working颤振 notifyListeners 似乎不起作用
【发布时间】: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() 完成其余的工作。

【问题讨论】:

    标签: flutter flutter-provider sqflite


    【解决方案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 应该可以解决问题。尝试在它们上设置调试点并找出它们不能正常工作的原因。
    猜你喜欢
    • 2021-09-04
    • 2021-08-27
    • 2019-06-18
    • 1970-01-01
    • 2018-11-17
    • 2021-02-20
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多