【问题标题】:Grab the textfield data from another stateful widget class从另一个有状态小部件类中获取文本字段数据
【发布时间】:2019-07-09 04:45:49
【问题描述】:

我试图通过访问状态类的方法来查看另一个类的文本字段数据。当我单击一个按钮时,我想在另一个类中获取文本字段值。

我尝试调用应该返回字符串的方法,但是当我尝试从其他类访问它时没有得到任何值。

class TitleWidget extends StatefulWidget{
  final IncidentComponent data;
  String titleVal;
  TitleWidget(this.data);
  @override
  TitleWidgetState createState() => TitleWidgetState();
}

class TitleWidgetState extends State<TitleWidget>{

  final titleController = TextEditingController();

  titleTextValue() {
    print("title text field: ${titleController.text}");
    return titleController.text;
  }

  @override
  void initState() {
    super.initState();
    titleController.addListener(titleTextValue);
  }

  @override
  Widget build(BuildContext context) {
    return  TextField(
      controller: titleController);

  }
}

我试图访问上面的方法来获取另一个类中的字符串。

FloatingActionButton.extended(
   label: Text("Complete Report",
   onPressed: () { print('title is ' + TitleWidgetState().titleTextValue()); }
)

当我按下其他类的 FAB 按钮时,我一直在期待文本字段的值。但是我从其他类方法中一无所获。 但是 titleTextValue() 方法的 print 语句会打印文本字段的正确值。

【问题讨论】:

标签: flutter


【解决方案1】:

试试这家全球商店。它可以节省大量传递各种对象的工作。最终你需要掌握集团。

import 'package:flutter_web/material.dart';
import 'package:flutter_web/widgets.dart';

void main() {
  runApp(new MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new Scaffold(
        body: new Column(
          mainAxisAlignment: MainAxisAlignment.spaceAround,
          children: <Widget>[
            new MyStatefulWidget1(),
            new MyStatefulWidget2(),
          ],
        ),
      ),
    );
  }
}

class MyStatefulWidget1 extends StatefulWidget {
  State createState() => new MyStatefulWidget1State();
}

class MyStatefulWidget1State extends State<MyStatefulWidget1> {
  final titleController = TextEditingController();

  titleTextValue() {
    print("title text field: ${titleController.text}");
    return titleController.text;
  }

  @override
  Widget build(BuildContext context) {
    store.set("titleTextValue", titleTextValue);
    return TextField(controller: titleController);
  }
}

class MyStatefulWidget2 extends StatefulWidget {
  State createState() => new MyStatefulWidget2State();
}

class MyStatefulWidget2State extends State<MyStatefulWidget2> {
  String _text = 'PRESS ME';

  @override
  Widget build(BuildContext context) {
    var titleTextValue = store.get("titleTextValue");
    return new Center(
      child: new RaisedButton(
          child: new Text(_text),
          onPressed: () {
            print('title is ' + titleTextValue());
          }),
    );
  }
}

class GlobalState {
  final Map<dynamic, dynamic> _data = <dynamic, dynamic>{};

  static GlobalState instance = GlobalState._();
  GlobalState._();

  set(dynamic key, dynamic value) => _data[key] = value;
  get(dynamic key) => _data[key];
}

final GlobalState store = GlobalState.instance;

【讨论】:

  • 这对我有用,将研究 BLOC。谢谢。我把这条线 - store.set("titleTextValue", titleTextValue);在方法 titleTextValue() 内,因为构建只会运行一次并使用控制器从文本字段返回文本。喜欢 - store.set("titleTextValue", titleController.text);
  • 你的回答让我想到我也可以使用共享偏好。我可以创建首选项,然后在创建小部件时删除或删除首选项 - flutter.dev/docs/cookbook/persistence/key-value
  • 确实,您可以在SharedPreferences中保存偏好设置,只要记住测试您保存的内容的正确序列化即可。
  • 我使用您的上述答案保存文件类型(图像)。谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-04
  • 1970-01-01
  • 2021-01-22
  • 1970-01-01
  • 2020-07-31
  • 2019-12-17
  • 1970-01-01
相关资源
最近更新 更多