为啥我的“数据”。“数据”没有使用 ChangeNotifierProvider 在 ChangeNotifier 类中更新?
Posted
技术标签:
【中文标题】为啥我的“数据”。“数据”没有使用 ChangeNotifierProvider 在 ChangeNotifier 类中更新?【英文标题】:Why is my "Data"."data" not updated in ChangeNotifier class using ChangeNotifierProvider?为什么我的“数据”。“数据”没有使用 ChangeNotifierProvider 在 ChangeNotifier 类中更新? 【发布时间】:2020-07-26 05:30:20 【问题描述】:我是新来的颤振。 我想问为什么我的文本字段的 onChange 没有触发:“Provider.ofContext).updateData(newString);”。 我的 Provider.of(context).data 的值没有更新,并且使用 2 个打印语句,始终只打印出 'call1'。
代码如下: 导入“包:颤振/material.dart”; 导入'package:provider/provider.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget
@override
Widget build(BuildContext context)
return ChangeNotifierProvider<Data>(
create: (_) => Data(),
lazy: false,
child: MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text(Provider.of<Data>(context).data),
),
body: Level2(),
),
),
);
class Level2 extends StatelessWidget
@override
Widget build(BuildContext context)
return Column(
children: <Widget>[
MyTextField(),
],
);
class MyTextField extends StatelessWidget
@override
Widget build(BuildContext context)
return TextField(onChanged: (newString)
print('called1');
Provider.of<Data>(context).updateData(newString);
print('called2');
);
class Data extends ChangeNotifier
String data = '1234567890';
void updateData(newString)
data = newString;
notifyListeners();
【问题讨论】:
【参考方案1】:您试图在您声明的同一个小部件中访问提供者,这是不正确的做法,提供者必须在您正在访问的上面的小部件中声明。
此外,始终按变量使用提供者数据(如在 MyTextField 小部件中使用的那样),否则它将不起作用。
以下代码可以帮助您了解更多。
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget
@override
Widget build(BuildContext context)
return ChangeNotifierProvider<Data>(
create: (_) => Data(),
child: MaterialApp(home: Level1()),
);
class Level1 extends StatelessWidget
@override
Widget build(BuildContext context)
return Scaffold(
appBar: AppBar(
title: Text(Provider.of<Data>(context).data),
),
body: Level2(),
);
class Level2 extends StatelessWidget
@override
Widget build(BuildContext context)
return Column(
children: <Widget>[
MyTextField(),
],
);
class MyTextField extends StatelessWidget
var dataprovider;
@override
Widget build(BuildContext context)
dataprovider = Provider.of<Data>(context);
return TextField(
onChanged: (newString)
print(dataprovider.data);
dataprovider.updateData(newString);
print('called2');
,
);
class Data extends ChangeNotifier
String data = '1234567890';
void updateData(newString)
print("cds");
data = newString;
notifyListeners();
【讨论】:
这行得通!谢谢!!所以在每个需要数据提供者的小部件中,我需要始终重新声明数据提供者或至少从父小部件传递它? 不需要传递数据提供者。您可以按照我在 MyTextField 小部件中显示的方式进行访问,但请确保它的父小部件具有数据提供者。以上是关于为啥我的“数据”。“数据”没有使用 ChangeNotifierProvider 在 ChangeNotifier 类中更新?的主要内容,如果未能解决你的问题,请参考以下文章
知道为啥我的 DbInitializer 中的数据没有填充到我的数据库中
为啥我的 RecyclerView 没有填充来自改造的数据?
为啥我的数据没有在 Flutter for web 中使用 api 从实时数据库中检索