我傳遞的方法如下,但它非常復雜。我想直接呼叫方法而不傳遞方法。有沒有辦法做到這一點?
class Parent extends StatelessWidget {
const Parent({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Child(onPressed: onPressed);
}
onPressed() {
print("onPressed");
}
}
class Child extends StatelessWidget {
const Child({
Key? key,
required this.onPressed,
}) : super(key: key);
final Function() onPressed;
@override
Widget build(BuildContext context) {
return Grandchild(onPressed: onPressed);
}
}
class Grandchild extends StatelessWidget {
const Grandchild({
Key? key,
required this.onPressed,
}) : super(key: key);
final Function() onPressed;
@override
Widget build(BuildContext context) {
return FloatingActionButton(
backgroundColor: Colors.black,
mini: true,
child: const Icon(
Icons.cached,
color: Colors.white,
),
tooltip: 'Change Camera',
onPressed: onPressed,
);
}
}
我正在設想像 Riverpod 的 StateNotifierProvider 之類的東西,你可以在其中傳遞方法,就像傳遞屬性一樣,但如果你能讓它變得更容易,那也很好。
uj5u.com熱心網友回復:
如果沒有狀態,則不必使用StateNotifierProvider。使用Provider:
final parentProvider = Provider<ParentNotifier>((ref) {
return ParentNotifier();
});
class ParentNotifier {
ParentNotifier();
onPressed() {
print("onPressed");
}
}
在用戶界面中:
main() => runApp(const ProviderScope(child: MaterialApp(home: Parent())));
class Parent extends ConsumerWidget {
const Parent({Key? key}) : super(key: key);
@override
Widget build(BuildContext context, WidgetRef ref) {
return const Child();
}
}
class Child extends ConsumerWidget {
const Child({Key? key}) : super(key: key);
@override
Widget build(BuildContext context, WidgetRef ref) {
return const Grandchild();
}
}
class Grandchild extends ConsumerWidget {
const Grandchild({Key? key}) : super(key: key);
@override
Widget build(BuildContext context, WidgetRef ref) {
return FloatingActionButton(
backgroundColor: Colors.black,
mini: true,
tooltip: 'Change Camera',
onPressed: () => ref.read(parentProvider).onPressed(),
child: const Icon(Icons.cached, color: Colors.white),
);
}
}
通知類Child(),Grandchild()現在您可以使用const.
uj5u.com熱心網友回復:
你可以在 Dartpad 中試試這個。請注意,我將您的 Parent 轉換為一個簡單的類,該類僅具有您希望子小部件訪問的方法。
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
const Color darkBlue = Color.fromARGB(255, 18, 32, 47);
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData.dark().copyWith(
scaffoldBackgroundColor: darkBlue,
),
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Center(
child: Provider<ModelFromParent>(
create: (_) => ModelFromParent(),
child: const Parent()
)
),
),
);
}
}
class ModelFromParent {
onPressed() {
print("onPressed");
}
}
class Parent extends StatelessWidget {
const Parent({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return const Child();
}
}
class Child extends StatelessWidget {
const Child({
Key? key
}) : super(key: key);
@override
Widget build(BuildContext context) {
return const Grandchild();
}
}
class Grandchild extends StatelessWidget {
const Grandchild({
Key? key
}) : super(key: key);
@override
Widget build(BuildContext context) {
return FloatingActionButton(
backgroundColor: Colors.black,
mini: true,
tooltip: 'Change Camera',
onPressed: Provider.of<ModelFromParent>(context, listen:false).onPressed,
child: const Icon(
Icons.cached,
color: Colors.white,
)
);
}
}
uj5u.com熱心網友回復:
這是一個如何從孫子呼叫父方法的示例。希望這能回答你的問題。
class ParentScreen extends StatelessWidget {
ParentScreen({super.key});
void parentMethod() {
print('calling parent method...');
}
@override
Widget build(BuildContext context) {
print('building parent ...');
return Scaffold(
appBar: AppBar(title: const Text('home page')),
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
const ChildWidget(
)
],
),
),
);
}
}
class ChildWidget extends StatefulWidget {
const ChildWidget({super.key, required this.grandChildKey});
@override
State<ChildWidget> createState() => ChildWidgetState();
}
class ChildWidgetState extends State<ChildWidget> {
@override
Widget build(BuildContext context) {
return Container(
color: Colors.amber,
child: Center(
child: Column(
children: [
const Text(
'child',
),
const GrandChild(
)
],
),
),
);
}
}
class GrandChild extends StatefulWidget {
const GrandChild({
super.key,
});
@override
State<GrandChild> createState() => GrandChildState();
}
class GrandChildState extends State<GrandChild> {
void callParent() {
//for stateless parent:
final parent = ParentScreen();
parent.parentMethod();
//if the parent is stateful:
//final parent = ParentScreenState();
//parent.parentMethod();
}
@override
Widget build(BuildContext context) {
return Column(
mainAxisSize: MainAxisSize.min,
children: [
Container(
color: Colors.amber,
child: const Center(child: Text('grand child'))),
ElevatedButton(onPressed: callParent, child: const Text('call parent'))
],
);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/522606.html
標籤:扑镖河荚颤动河荚
下一篇:如何在dart中撰寫多個條件?
