我正在寻找一种方法,当按下tabBar中的特定选项卡时,可以隐藏/更改appBar动作。
调用
import UIKit
import CoreBluetooth
protocol BLEScanDelegate {
func reloadDeviceList()
}
internal class BLEScanmanager: NSObject {
private var centralManager: CBCentralManager?
var devices : [Bluetooth] = []
var delegate: BLEScanDelegate?
let centralManagerDelegate = MyCentralManagerDelegateImplementation()
override init() {
super.init()
centralManagerDelegate.delegate = self
centralManager = CBCentralManager(delegate: centralManagerDelegate,queue: .main)
}
// MARK:- Custom methods
func isScanning() -> Bool {
return centralManager?.isScanning ?? false
}
func stopScanning() {
centralManager?.stopScan()
}
func startScanning() {
devices.removeAll()
let options: [String: Any] = [CBCentralManagerScanOptionAllowDuplicatesKey:
Nsnumber(value: false)]
centralManager?.scanForPeripherals(withServices: nil,options: options)
}
}
private extension BLEScanmanager: CentralManagerEventsDelegate {
func didUpdateState(){
// Here goes the switch with the startScanning
}
func didDiscoverPeripheral(...) {
// Here goes the logic on new peripheral and the call on self.delegate?.reloadDeviceList
}
}
internal protocol CentralManagerEventsDelegate: class {
func didUpdateState()
func didDiscoverPeripheral(...)
}
internal class MyCentralManagerDelegateImplementation: NSObject,CBCentralManagerDelegate {
weak var delegate: CentralManagerEventsDelegate?
func centralManagerDidUpdateState(_ central: CBCentralManager) {
self.delegate?.didUpdateState()
}
func centralManager(_ central: CBCentralManager,didDiscover peripheral: CBPeripheral,advertisementData: [String : Any],rssi RSSI: Nsnumber) {
self.delegate?.didDiscoverPeripheral(actualParams)
}
}
方法会重绘整个小部件以及所有TabController子级/屏幕,这确实很糟糕。
下面是我的代码:
setState(() { })
我们如何重绘enum SelectedTab {
items,sales,raw_items,orders
}
class _MyHomePageState extends State<MyHomePage>
{
Widget rightactionButton(BuildContext context)
{
//This is the widget which is expected to be update upon tab change
SelectedTab currentTab = Globals.instance.selectedTab;
return Visibility (
child: . . .
visible: currentTab != SelectedTab.sales,);
}
Widget navBar(BuildContext context)
{
return AppBar(
title: Text('Example'),actions: <Widget>[
rightactionButton(context),],);
}
Widget tabBar(BuildContext context)
{
return Container(
child: TabBar(
tabs: [
. . . .
],onTap: (index) {
Globals.instance.selectedTab = SelectedTab.values[index];
//Refresh rightactionButton
},),);
}
Widget tabScreens(BuildContext context) {
return TabBarView(
children: [
. . . .
],);
}
@override
Widget build(BuildContext context)
{
return DefaultTabController(
length: 4,child: Scaffold (
appBar: navBar(context),bottomSheet: tabBar(context),body: tabScreens(context),);
}
}
而不是重绘支架中的所有小部件?