【问题标题】: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
        ),
      ),
    );
  }
}

【问题讨论】:

标签: flutter provider


【解决方案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());
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-24
      • 2021-08-28
      • 2021-03-17
      • 2020-01-13
      • 2020-08-09
      • 2021-11-22
      • 2021-02-20
      • 1970-01-01
      相关资源
      最近更新 更多