提供者不更新文本小部件

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&lt;Data&gt;(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

是否可以为 Text 小部件提供默认值?

当 Android 中的 Activity 内容更改时,小部件不更新

颤振:如何更新文本小部件值

小部件不更新视图

Flutter 文本小部件