【问题标题】:How to listen to changes for TextField using Provider package?如何使用 Provider 包监听 TextField 的变化?
【发布时间】:2020-09-23 17:14:47
【问题描述】:

我正在重新编写一个非常简单的计算平均值的应用程序,但是我很难使用 Provider 包。我想将业务逻辑移出负责创建小部件的文件。我想使用 Provider 包。

好的,我有负责构建布局的文件,但我想听听 TextField 小部件的变化。我如何有效地做到这一点?我有另一个文件,它是一个提供程序类,它将监听这个 TextField 小部件的变化。但是,我不想在 main.dart 文件中创建 ChangeNotifierProvider,因为我想要一个本地状态。我想将 TextField 的值传递给提供程序类。

我的应用如下所示:

代码:

布局:

import 'package:flutter/material.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:provider/provider.dart';

import '../providers/arithmetic_average.dart';

class ArithmeticAverageScreen extends StatefulWidget {
  @override
  _ArithmeticAverageScreenState createState() => _ArithmeticAverageScreenState();
}


class _ArithmeticAverageScreenState extends State<ArithmeticAverageScreen> {

  final _textFieldController = TextEditingController();

  var _grades = List<Widget>();

  @override
  void dispose() {
    _textFieldController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
          create: (context) => ArithmeticAverageProvider(),
          child: Scaffold(
        appBar: AppBar(
          title: Text('arithmetic_average_title').tr(),
        ),
        body: Container(
          padding: EdgeInsets.all(16.0),
          child: ListView(
            children: <Widget>[
              Card(
                child: Container(
                  padding: EdgeInsets.symmetric(vertical: 20.0),
                  child: Column(
                    mainAxisSize: MainAxisSize.min,
                    children: <Widget>[
                      ListTile(
                        leading: Icon(Icons.help),
                        title: Text('arithmetic_average_help').tr(),
                        subtitle: Text('arithmetic_average_help_content').tr(),
                      )
                    ],
                  ),
                ) 
              ),
              SizedBox(height: 16.0),
              Card(
                child: Container(
                  padding: EdgeInsets.symmetric(vertical: 20.0, horizontal: 20.0),
                  child: Column(
                    mainAxisSize: MainAxisSize.min,
                    crossAxisAlignment: CrossAxisAlignment.stretch,
                    children: <Widget>[
                      Text('arithmetic_average_your_grades', style: Theme.of(context).textTheme.headline5).tr(),
                      SizedBox(height: 16.0),
                      Text('arithmetic_average_grades_one_at_a_time', style: Theme.of(context).textTheme.headline6,).tr(),
                      SizedBox(height: 16.0),
                      Row(
                        children: <Widget>[
                          Container(
                            width: 60.0,
                            child: TextField(
                              controller: _textFieldController,
                              keyboardType: TextInputType.numberWithOptions(
                                decimal: true
                              ),
                              decoration: InputDecoration(
                                hintText: '5',
                                labelText: 'arithmetic_average_grade'.tr()
                              ),
                            ),
                          ),
                          SizedBox(width: 20.0,),
                          RaisedButton(
                            onPressed: () {
                            },
                            color: Colors.teal[300],
                            textColor: Colors.white,
                            child: Text('arithmetic_average_add_button').tr(),
                          ),
                        ],
                      ),
                      SizedBox(height: 16.0,),
                      Wrap(
                        children: _grades,
                      ),
                    ],
                  ),
                ),
              )
            ],
          ),
        )
      ),
    );
  }
}

提供者:

import 'package:flutter/material.dart';

class ArithmeticAverageProvider extends ChangeNotifier {

}

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    TextField "onChange" 应该调用 "ArithmeticAverageProvider()" 中的一个方法,该方法调用 "NotifyListeners()"。

    【讨论】:

    • 但是我想要一个 RaisedButton 从 TextEditingController 中检索一个值。我该怎么做?
    • 凸起按钮的 onPress,从 textedit 中获取值,更新 ArithmeticAverageProvider() 中的值,该值执行 NotifyListeners()。在构建中,您创建一个新的小部件,该小部件从 ArithmeticAverageProvider() 获取值。
    猜你喜欢
    • 2018-09-22
    • 2020-08-13
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    相关资源
    最近更新 更多