FLBFlutterViewContainer.m 6.5 KB
Newer Older
Jidong Chen's avatar
init  
Jidong Chen committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
/*
 * The MIT License (MIT)
 * 
 * Copyright (c) 2019 Alibaba Group
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

25 26
#import "FLBFlutterViewContainer.h"
#import "FLBFlutterApplication.h"
Jidong Chen's avatar
Jidong Chen committed
27
#import "BoostMessageChannel.h"
28 29
#import "FLBFlutterContainerManager.h"
#import "FlutterBoostPlugin_private.h"
Jidong Chen's avatar
init  
Jidong Chen committed
30

31
#define FLUTTER_APP [FlutterBoostPlugin sharedInstance].application
Jidong Chen's avatar
Jidong Chen committed
32 33
#define FLUTTER_VIEW FLUTTER_APP.flutterViewController.view
#define FLUTTER_VC FLUTTER_APP.flutterViewController
Jidong Chen's avatar
init  
Jidong Chen committed
34

35
@interface FLBFlutterViewContainer  ()
Jidong Chen's avatar
init  
Jidong Chen committed
36 37 38 39 40
@property (nonatomic,copy,readwrite) NSString *name;
@property (nonatomic,strong,readwrite) NSDictionary *params;
@property (nonatomic,assign) long long identifier;
@end

41
@implementation FLBFlutterViewContainer
Jidong Chen's avatar
init  
Jidong Chen committed
42

Jidong Chen's avatar
Jidong Chen committed
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
- (instancetype)init
{
    [FLUTTER_APP.flutterProvider prepareEngineIfNeeded];
    if(self = [super initWithEngine:FLUTTER_APP.flutterProvider.engine
                            nibName:nil
                             bundle:nil]){
        [self _setup];
    }
    return self;
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder{
    if (self = [super initWithCoder: aDecoder]) {
        NSAssert(NO, @"unsupported init method!");
        [self _setup];
    }
    return self;
}

Jidong Chen's avatar
init  
Jidong Chen committed
62 63 64 65 66
- (void)setName:(NSString *)name params:(NSDictionary *)params
{
    if(!_name && name){
        _name = name;
        _params = params;
Jidong Chen's avatar
Jidong Chen committed
67
        [BoostMessageChannel didInitPageContainer:^(NSNumber *r) {}
Jidong Chen's avatar
init  
Jidong Chen committed
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
                                               pageName:name
                                                 params:params
                                               uniqueId:[self uniqueIDString]];
    }
}


static NSUInteger kInstanceCounter = 0;

+ (NSUInteger)instanceCounter
{
    return kInstanceCounter;
}

+ (void)instanceCounterIncrease
{
    kInstanceCounter++;
    if(kInstanceCounter == 1){
Jidong Chen's avatar
Jidong Chen committed
86
        [FLUTTER_APP resume];
Jidong Chen's avatar
init  
Jidong Chen committed
87 88 89 90 91 92 93
    }
}

+ (void)instanceCounterDecrease
{
    kInstanceCounter--;
    if([self.class instanceCounter] == 0){
Jidong Chen's avatar
Jidong Chen committed
94
        [FLUTTER_APP pause];
Jidong Chen's avatar
init  
Jidong Chen committed
95 96 97 98 99 100 101 102
    }
}

- (NSString *)uniqueIDString
{
    return @(_identifier).stringValue;
}

103 104 105 106 107
- (void)_setup
{
    static long long sCounter = 0;
    _identifier = sCounter++;
    [self.class instanceCounterIncrease];
Jidong Chen's avatar
init  
Jidong Chen committed
108 109 110 111 112 113 114 115 116 117
}

- (void)dealloc
{
    [self notifyWillDealloc];
    [NSNotificationCenter.defaultCenter removeObserver:self];
}

- (void)notifyWillDealloc
{
Jidong Chen's avatar
Jidong Chen committed
118
    [BoostMessageChannel willDeallocPageContainer:^(NSNumber *r) {}
Jidong Chen's avatar
init  
Jidong Chen committed
119 120 121
                                               pageName:_name params:_params
                                               uniqueId:[self uniqueIDString]];

Jidong Chen's avatar
Jidong Chen committed
122
    [FLUTTER_APP removeViewController:self];
Jidong Chen's avatar
init  
Jidong Chen committed
123 124 125 126
    
    [self.class instanceCounterDecrease];
}

Jidong Chen's avatar
Jidong Chen committed
127 128 129 130
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = UIColor.whiteColor;
}
Jidong Chen's avatar
init  
Jidong Chen committed
131 132 133 134 135 136 137

#pragma mark - ScreenShots
- (BOOL)isFlutterViewAttatched
{
    return FLUTTER_VIEW.superview == self.view;
}

Jidong Chen's avatar
Jidong Chen committed
138
- (void)attatchFlutterEngine
Jidong Chen's avatar
init  
Jidong Chen committed
139
{
Jidong Chen's avatar
Jidong Chen committed
140 141
    [FLUTTER_APP.flutterProvider prepareEngineIfNeeded];
    [FLUTTER_APP.flutterProvider atacheToViewController:self];
Jidong Chen's avatar
init  
Jidong Chen committed
142 143
}

Jidong Chen's avatar
Jidong Chen committed
144
- (void)detatchFlutterEngine
Jidong Chen's avatar
init  
Jidong Chen committed
145
{
Jidong Chen's avatar
Jidong Chen committed
146
    [FLUTTER_APP.flutterProvider detach];
Jidong Chen's avatar
init  
Jidong Chen committed
147 148 149 150 151 152 153 154
}


#pragma mark - Life circle methods

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
Jidong Chen's avatar
Jidong Chen committed
155
    [FLUTTER_APP resume];
Jidong Chen's avatar
init  
Jidong Chen committed
156 157 158 159
}

- (void)viewWillAppear:(BOOL)animated
{
Jidong Chen's avatar
Jidong Chen committed
160 161 162 163
    if([FLUTTER_APP contains:self]){
        [self detatchFlutterEngine];
    }else{
        [self attatchFlutterEngine];
Jidong Chen's avatar
Jidong Chen committed
164
    }
Jidong Chen's avatar
Jidong Chen committed
165
  
Jidong Chen's avatar
Jidong Chen committed
166
    [FLUTTER_APP resume];
Jidong Chen's avatar
Jidong Chen committed
167
    
Jidong Chen's avatar
init  
Jidong Chen committed
168 169
    //For new page we should attach flutter view in view will appear
    //for better performance.
Jidong Chen's avatar
Jidong Chen committed
170
 
Jidong Chen's avatar
Jidong Chen committed
171
    [BoostMessageChannel willShowPageContainer:^(NSNumber *result) {}
Jidong Chen's avatar
init  
Jidong Chen committed
172 173 174 175
                                            pageName:_name
                                              params:_params
                                            uniqueId:self.uniqueIDString];
    //Save some first time page info.
176 177 178 179
    if(![FlutterBoostPlugin sharedInstance].fPagename){
        [FlutterBoostPlugin sharedInstance].fPagename = _name;
        [FlutterBoostPlugin sharedInstance].fPageId = self.uniqueIDString;
        [FlutterBoostPlugin sharedInstance].fParams = _params;
Jidong Chen's avatar
init  
Jidong Chen committed
180 181 182 183 184 185 186
    }
    
    [super viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated
{
Jidong Chen's avatar
Jidong Chen committed
187
    [FLUTTER_APP addUniqueViewController:self];
Jidong Chen's avatar
init  
Jidong Chen committed
188
    
Jidong Chen's avatar
Jidong Chen committed
189 190
    //Ensure flutter view is attached.
    [self attatchFlutterEngine];
Jidong Chen's avatar
Jidong Chen committed
191 192
    [FLUTTER_APP resume];
 
Jidong Chen's avatar
Jidong Chen committed
193
    [BoostMessageChannel didShowPageContainer:^(NSNumber *result) {}
Jidong Chen's avatar
init  
Jidong Chen committed
194 195 196 197 198 199 200 201 202
                                           pageName:_name
                                             params:_params
                                           uniqueId:self.uniqueIDString];
    
    [super viewDidAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated
{
Jidong Chen's avatar
Jidong Chen committed
203
    [BoostMessageChannel willDisappearPageContainer:^(NSNumber *result) {}
Jidong Chen's avatar
init  
Jidong Chen committed
204 205 206
                                                 pageName:_name
                                                   params:_params
                                                 uniqueId:self.uniqueIDString];
207
    [[[UIApplication sharedApplication] keyWindow] endEditing:YES];
Jidong Chen's avatar
init  
Jidong Chen committed
208 209 210 211 212 213
    [super viewWillDisappear:animated];
}


- (void)viewDidDisappear:(BOOL)animated
{
Jidong Chen's avatar
Jidong Chen committed
214 215 216 217
    [super viewDidDisappear:animated];
    
    [FLUTTER_APP resume];
    
Jidong Chen's avatar
Jidong Chen committed
218
    [BoostMessageChannel didDisappearPageContainer:^(NSNumber *result) {}
Jidong Chen's avatar
init  
Jidong Chen committed
219 220 221 222 223
                                                pageName:_name
                                                  params:_params
                                                uniqueId:self.uniqueIDString];
}

Jidong Chen's avatar
Jidong Chen committed
224 225 226 227 228 229 230 231 232
- (void)installSplashScreenViewIfNecessary {
    //Do nothing.
}

- (BOOL)loadDefaultSplashScreenView
{
    return NO;
}

Jidong Chen's avatar
init  
Jidong Chen committed
233 234

@end