跳到主要内容

自定义 controller

import 'package:flutter/material.dart';

class CustomComponent extends StatelessWidget {
final bool isHidden;

CustomComponent({required this.isHidden});

@override
Widget build(BuildContext context) {
return Visibility(
visible: !isHidden,
child: Container(
width: 200,
height: 200,
color: Colors.blue,
child: Center(
child: Text(
'Custom Component',
style: TextStyle(
fontSize: 20,
color: Colors.white,
),
),
),
),
);
}
}

class CustomController {
late VoidCallback _listener;
bool _isHidden = false;

bool get isHidden => _isHidden;

set isHidden(bool value) {
_isHidden = value;
_listener();
}

void addListener(VoidCallback listener) {
_listener = listener;
}

void removeListener() {
_listener = () {};
}
}

class CustomScreen extends StatefulWidget {
@override
_CustomScreenState createState() => _CustomScreenState();
}

class _CustomScreenState extends State<CustomScreen> {
late CustomController _controller;

@override
void initState() {
super.initState();
_controller = CustomController();
_controller.addListener(_handleControllerChange);
}

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

void _handleControllerChange() {
setState(() {});
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Custom Component Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
CustomComponent(
isHidden: _controller.isHidden,
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
_controller.isHidden = !_controller.isHidden;
},
child: Text(
_controller.isHidden ? 'Show' : 'Hide',
),
),
],
),
),
);
}
}

void main() {
runApp(MaterialApp(
home: CustomScreen(),
));
}


将`CustomController`实例化为`_controller`,并在初始化和销毁阶段添加/移除监听器。在`build`方法中,我们使用`CustomComponent`来展示自定义组件,并使用`_controller.isHidden`来传递是否隐藏组件的状态。

通过点击按钮,我们可以通过控制器的`isHidden`属性来切换组件的隐藏状态。每当`isHidden`属性发生变化时,控制器的监听器会被调用