import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'controller.dart'; import 'widgets/follow_list.dart'; import 'widgets/owner_follow_list.dart'; class FollowPage extends StatefulWidget { const FollowPage({super.key}); @override State createState() => _FollowPageState(); } class _FollowPageState extends State { late String mid; late FollowController _followController; final ScrollController scrollController = ScrollController(); @override void initState() { super.initState(); mid = Get.parameters['mid']!; _followController = Get.put(FollowController(), tag: mid); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( elevation: 0, scrolledUnderElevation: 0, titleSpacing: 0, centerTitle: false, title: Text( _followController.isOwner.value ? '我的关注' : '${_followController.name}的关注', style: Theme.of(context).textTheme.titleMedium, ), actions: [ IconButton( onPressed: () => Get.toNamed('/followSearch?mid=$mid'), icon: const Icon(Icons.search_outlined), ), PopupMenuButton( icon: const Icon(Icons.more_vert), itemBuilder: (BuildContext context) => [ PopupMenuItem( onTap: () => Get.toNamed('/blackListPage'), child: const Row( mainAxisSize: MainAxisSize.min, children: [ Icon(Icons.block, size: 19), SizedBox(width: 10), Text('黑名单管理'), ], ), ) ], ), const SizedBox(width: 6), ], ), body: Obx( () => !_followController.isOwner.value ? FollowList(ctr: _followController) : FutureBuilder( future: _followController.followUpTags(), builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.done) { var data = snapshot.data; if (data['status']) { return Column( children: [ TabBar( controller: _followController.tabController, isScrollable: true, tabAlignment: TabAlignment.start, tabs: [ for (var i in data['data']) ...[ Tab(text: i.name), ] ]), Expanded( child: TabBarView( controller: _followController.tabController, children: [ for (var i = 0; i < _followController.tabController.length; i++) ...[ OwnerFollowList( ctr: _followController, tagItem: _followController.followTags[i], ) ] ], ), ), ], ); } else { return const SizedBox(); } } else { return const SizedBox(); } }, ), ), ); } } class _FakeAPI { static const List _kOptions = [ 'aardvark', 'bobcat', 'chameleon', ]; // Searches the options, but injects a fake "network" delay. static Future> search(String query) async { await Future.delayed( const Duration(seconds: 1)); // Fake 1 second delay. if (query == '') { return const Iterable.empty(); } return _kOptions.where((String option) { return option.contains(query.toLowerCase()); }); } }