簡體   English   中英

Flutter - 如何從父級調用子級小部件的方法

[英]Flutter - how to call child widget's method from parent

假設我們有兩個有狀態的小部件

ParentWidget(){

}

ChildWidget() {
  someMethod(){
    // some code, for example setState code
  }

}

現在,當我在ParentWidget使用ChildWidget時,如何調用someMethod()

如果您需要在小部件上調用函數,您可以使用:

context.findAncestorWidgetOfExactType<T>()

如果您需要在該小部件的狀態上調用函數,您可以使用:

context.findRootAncestorStateOfType<T>();

閱讀更多信息:

https://api.flutter.dev/flutter/widgets/BuildContext/findAncestorWidgetOfExactType.html

https://api.flutter.dev/flutter/widgets/BuildContext/findRootAncestorStateOfType.html

這是我使用過的方式。

  • 創建一個 GlobalKey 實例
  • 將 Globalkey 作為 Key 參數傳遞給子小部件。
  • 調用 GlobalKey.currentState.method();
GlobalKey<ChildWidgetState> globalKey = GlobalKey();

ParentWidget(){

   ChildWidget(key: globalKey);

   ...

   globalKey.currentState.someMethod();


}

ChildWidget() {
  ChildWidget({Key key}) : super(key: key);

  someMethod(){
    // some code, for example setState code
  }

}

測試代碼

import 'package:flutter/material.dart';

const Color darkBlue = Color.fromARGB(255, 18, 32, 47);

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

GlobalKey<ChildWidgetState> globalKey = GlobalKey();

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData.dark().copyWith(
        scaffoldBackgroundColor: darkBlue,
      ),
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: Center(
          child: MyWidget(),
        ),
      ),
    );
  }
}

class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        InkWell(
          onTap: () {
            globalKey.currentState.someMethod();
          },
          child: Text('ParentWidget'),
        ),

        ChildWidget(key: globalKey),
      ],
    );
  }
}


class ChildWidget extends StatefulWidget {
  ChildWidget({Key key}) : super(key: key);
  
  @override
  ChildWidgetState createState() => ChildWidgetState();
  
}

class ChildWidgetState extends State<ChildWidget> {
  void someMethod() {
    print('someMethod is called');
  }
  @override
  Widget build(BuildContext context) {
    return Text('childWidget');
  }
}

暫無
暫無

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

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