簡體   English   中英

如何在 flutter 中將 controller 數據從一個小部件傳遞到另一個小部件

[英]How can I pass the controller data from one widget to another in flutter

在我的searchPage.dart我有兩個 statefulWidget, SearchScreenTopSearchWidget SearchScreen有一個TextField ,當用戶開始輸入時,它應該從另一個小部件TopSearchWidget填充,但我不知道如何將參數/數據從一個小部件傳遞到另一個小部件。 這是我的代碼

class SearchPage extends StatefulWidget {
  const SearchPage({Key key}) : super(key: key);

  @override
  State<StatefulWidget> createState() => _SearchPageState();
}

class _SearchPageState extends State<SearchPage> {
   TextEditingController dropOffTextEditingController = TextEditingController(); 
  );

  @override
  void initState() {
    super.initState();
    dropOffTextEditingController.addListener(textOnChanged);
  }

  void textOnChanged() {
    controller.setSearchableText(dropOffTextEditingController.text);
  }

  @override
  void dispose() {
    dropOffTextEditingController.removeListener(textOnChanged);
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
......
Row(
        children: [
            SizedBox(width: 18.0),
            Expanded(
                child: Container(
                    decoration: BoxDecoration(
                        color: Colors.grey[400],
                        borderRadius: BorderRadius.circular(5.0),
                    ),
                    child: Padding(
                        padding: EdgeInsets.all(3.0),
                        child: TextField(
                            controller: dropOffTextEditingController,

                            onEditingComplete: () async {
                                FocusScope.of(context).requestFocus(new FocusNode());
                            },
                            decoration: InputDecoration(
                                hintText: "Drop off Location",
                                fillColor: Colors.grey[400],
                                filled: true,
                                border: InputBorder.none,
                                isDense: true,
                                contentPadding: EdgeInsets.only(left: 11.0, top: 8.0, bottom: 8.0),
                            ),
                        ),
                    ),
                ))
        ],
    ),
    SizedBox(height: 10.0),
    topWidgetPicker: TopSearchWidget(),

並從 TextField 接收數據,以便它可以開始搜索..

class TopSearchWidget extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _TopSearchWidgetState();
}

class _TopSearchWidgetState extends State<TopSearchWidget> {
 

  @override
  void initState() {
    super.initState();
    controller = ***** What should go here *****?
    controller.searchableText.addListener(onSearchableTextChanged);
  }

void onSearchableTextChanged() async {
    final v = controller.searchableText.value;
   .............
  }

您可以將SearchPage中的 controller 傳遞到TopSearchWidget嗎?

class _SearchPageState extends State<SearchPage> {
  final dropOffTextEditingController = TextEditingController();
  @override
  Widget build(BuildContext context) {
    // ...
    topWidgetPicker: TopSearchWidget(dropOffTextEditingController),
    // ...
  }
}

class TopSearchWidget extends StatefulWidget {
  final TextEditingController controller;
  TopSearchWidget(this.controller);

  @override
  State<StatefulWidget> createState() => _TopSearchWidgetState();
}

class _TopSearchWidgetState extends State<TopSearchWidget> {
  @override
  void initState() {
    super.initState();
    widget.controller.searchableText.addListener(onSearchableTextChanged);
  }

  void onSearchableTextChanged() async {
    final v = widget.controller.searchableText.value;
    .............
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM