提供者不更新文本小部件
Posted
技术标签:
【中文标题】提供者不更新文本小部件【英文标题】:Provider does not update Text widget 【发布时间】:2021-01-22 01:28:27 【问题描述】:在 textField 小部件中输入一些文本后,我在更新 Level3 类中的文本小部件时遇到问题。 感谢您的帮助
在下面的代码中公开数据:
class MyApp extends StatelessWidget
@override
Widget build(BuildContext context)
return MaterialApp(
// home: TasksScreen(),
home: ChangeNotifierProvider<Data>(
create: (context) => Data(),
child: Scaffold(
appBar: AppBar(
title: Container(
child: MyText(),
),
),
body: Level1(),
),
),
);
在下面的类中为模型数据创建数据类
class Data extends ChangeNotifier
String data = 'this data';
void changeString(String newString)
data = newString;
print(newString);//don't print anything after typing in textFild
print(data);//don't print either
notifyListeners();
我想在下面的代码中使用 MyTextField 中的数据对象属性
但似乎没有触发Provider.of<Data>(context).changeString(newValue)
class MyTextField extends StatelessWidget
@override
Widget build(BuildContext context)
return TextField(
onChanged: (newValue)
print(newValue);//print newValue correctly
Provider.of<Data>(context).changeString(newValue);
,
);
class Level3 extends StatelessWidget
@override
Widget build(BuildContext context)
return Container(
child: Center(
child: Text(
//this part don't update as typing in textField
Provider.of<Data>(context).data,
//will return an instance of Provider
//type found in the context that is sent as a parameter
),
),
);
【问题讨论】:
这能回答你的问题吗? When to use Provider.of<X> vs. Consumer<X> in Flutter 【参考方案1】:你可以试试这个
(context.watch<Data>().data).toString();
【讨论】:
【参考方案2】:您可以在下面复制粘贴运行完整代码
在onChanged
,您可以使用listen: false
代码sn-p
return TextField(
onChanged: (newValue)
print(newValue); //print newValue correctly
Provider.of<Data>(context, listen: false).changeString(newValue);
,
);
工作演示
完整代码
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class Data extends ChangeNotifier
String data = 'this data';
void changeString(String newString)
data = newString;
print(newString); //don't print anything after typing in textFild
print(data); //don't print either
notifyListeners();
class MyApp extends StatelessWidget
@override
Widget build(BuildContext context)
return MaterialApp(
// home: TasksScreen(),
home: ChangeNotifierProvider<Data>(
create: (context) => Data(),
child: Scaffold(
appBar: AppBar(
title: Container(
child: MyTextField(),
),
),
body: Level3(),
),
),
);
class MyTextField extends StatelessWidget
@override
Widget build(BuildContext context)
return TextField(
onChanged: (newValue)
print(newValue); //print newValue correctly
Provider.of<Data>(context, listen: false).changeString(newValue);
,
);
class Level3 extends StatelessWidget
@override
Widget build(BuildContext context)
return Container(
child: Center(
child: Text(
//this part don't update as typing in textField
Provider.of<Data>(context).data,
//will return an instance of Provider
//type found in the context that is sent as a parameter
),
),
);
void main()
runApp(MyApp());
【讨论】:
以上是关于提供者不更新文本小部件的主要内容,如果未能解决你的问题,请参考以下文章
编辑文本控制器更新小部件值而不调用 setState() - Flutter