【问题标题】:Update widget from other widget if they are in 2 different dart file如果它们在 2 个不同的 dart 文件中,则从其他小部件更新小部件
【发布时间】:2019-08-07 22:26:33
【问题描述】:

在 Flutter 中创建示例计算器应用。但不知道如何通信每个小部件,它们是不同的 dart 文件。

  • Main.dart ----------(应用程序的起点)
  • CalculatorFrame.dart ---------(导入数字板,输入文本框和 表格计算器视图)
  • NumberButton.dart --------(代表按钮小部件)
  • NumberBoards.dart ----------(导入 numberbutton 并创建计算器的按钮 (0-9) 部分)
  • EntryTextbox.dart -----------(代表按钮按下操作和计算值的文本框条目)

我很难实现与这些小部件的交互。在按下按钮时,需要更新 EntryTextbox 小部件。如果小部件在不同的 dart 文件中怎么办。

请提出建议。

【问题讨论】:

    标签: dart flutter


    【解决方案1】:
    • 1.) 您需要将 CalculatorFrame 设为 Stateful 小部件。
    • 2.) 您需要为 EntryTextbox 小部件创建一个状态,例如 userInput 状态,以跟踪当前用户输入的内容。
    • 3.) 您需要使用setState 方法创建一个更新状态的方法,该方法是在使用Stateful 小部件时内置的。
    • 4.) 您需要将该方法传递给NumberBoards,然后创建一个构造函数来接收该方法,然后将该方法传递给NumberButton 小部件。

    【讨论】:

    【解决方案2】:

    要在按下按钮时更改 EntryTextbox 小部件的状态,请将包含小部件(我想是 CalculatorFrame)声明为 StatefullWidget 并使用 String 或任何字段,您将从中初始化 EntryTextbox .实现一个函数,在按下按钮时更改该字段,并将其作为构造函数参数传递给 NumberButton 小部件。
    这是一个示意图示例:

    import 'package:flutter/material.dart';
    
    class CalculatorFrame extends StatefulWidget {
      @override
      _CalculatorFrameState createState() => _CalculatorFrameState();
    }
    
    class _CalculatorFrameState extends State<CalculatorFrame> {
      String _text;
    
      @override
      Widget build(BuildContext context) => ...( // container widget of your choice
        EntryTextbox(text: _text),
        NumberButton(text: '0', onPressed: _onPressed,),
        ...,
        NumberButton(text: '9', onPressed: _onPressed,),
      );
    
      void _onPressed(String buttonText) =>
          setState(() => _text += buttonText);
    }
    
    class EntryTextbox extends StatelessWidget {
      final String text;
    
      const EntryTextbox({Key key, this.text}) : super(key: key);
    
      @override
      Widget build(BuildContext context) => ...(text: text); // text entry widget of your choice
    }
    
    class NumberButton extends StatelessWidget {
      final String text;
      final Function(String) onPressed;
    
      const NumberButton({Key key, this.onPressed, this.text}) : super(key: key);
    
      @override
      Widget build(BuildContext context) => ...Button( // button widget of your choice
        child: Text(text),
        onPressed: () => onPressed(text),
      );
    }
    

    由于在您的示例中 NumberButton 小部件位于 NumberBoards 小部件内,因此 NumberBoards 有责任接受 onPressed 作为构造函数参数并将其传递给每个 NumberButton 构造函数。
    在我的示例中,onPressed 接受 String 参数 - 按下按钮的文本。您可能决定传递int 或者更复杂的数据类。

    这种非架构方法适用于小型应用程序和示例。但是,我宁愿推荐使用 BLoC 或 ScopedModel 来完成您的任务。官方文档的Simple app state management 部分可能会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-02
      • 1970-01-01
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      • 2020-07-19
      • 1970-01-01
      相关资源
      最近更新 更多