Flutter iOS Embedder
FlutterRestorationPlugin.mm
Go to the documentation of this file.
1 // Copyright 2013 The Flutter Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
6 
7 #import <Foundation/Foundation.h>
8 #import <UIKit/UIKit.h>
9 
10 #include "flutter/fml/logging.h"
11 
13 
15 @property(nonatomic, copy) FlutterResult pendingRequest;
16 @end
17 
18 @implementation FlutterRestorationPlugin {
19  BOOL _waitForData;
21 }
22 
23 - (instancetype)initWithChannel:(FlutterMethodChannel*)channel
24  restorationEnabled:(BOOL)restorationEnabled {
25  FML_DCHECK(channel) << "channel must be set";
26  self = [super init];
27  if (self) {
28  [channel setMethodCallHandler:^(FlutterMethodCall* call, FlutterResult result) {
29  [self handleMethodCall:call result:result];
30  }];
31  _restorationEnabled = restorationEnabled;
32  _waitForData = restorationEnabled;
33  }
34  return self;
35 }
36 
37 - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
38  if ([[call method] isEqualToString:@"put"]) {
39  NSAssert(self.pendingRequest == nil, @"Cannot put data while a get request is pending.");
40  FlutterStandardTypedData* data = [call arguments];
41  self.restorationData = [data data];
42  result(nil);
43  } else if ([[call method] isEqualToString:@"get"]) {
44  if (!_restorationEnabled || !_waitForData) {
45  result([self dataForFramework]);
46  return;
47  }
48  NSAssert(self.pendingRequest == nil, @"There can only be one pending request.");
49  self.pendingRequest = result;
50  } else {
52  }
53 }
54 
55 - (void)setRestorationData:(NSData*)data {
56  if (data != _restorationData) {
57  [_restorationData release];
58  _restorationData = [data retain];
59  }
60  _waitForData = NO;
61  if (self.pendingRequest != nil) {
62  self.pendingRequest([self dataForFramework]);
63  self.pendingRequest = nil;
64  }
65 }
66 
67 - (void)markRestorationComplete {
68  _waitForData = NO;
69  if (self.pendingRequest != nil) {
70  NSAssert(_restorationEnabled, @"No request can be pending when restoration is disabled.");
71  self.pendingRequest([self dataForFramework]);
72  self.pendingRequest = nil;
73  }
74 }
75 
76 - (void)reset {
77  self.pendingRequest = nil;
78  self.restorationData = nil;
79 }
80 
81 - (NSDictionary*)dataForFramework {
82  if (!_restorationEnabled) {
83  return @{@"enabled" : @NO};
84  }
85  if (self.restorationData == nil) {
86  return @{@"enabled" : @YES};
87  }
88  return @{
89  @"enabled" : @YES,
90  @"data" : [FlutterStandardTypedData typedDataWithBytes:self.restorationData]
91  };
92 }
93 
94 - (void)dealloc {
95  [_restorationData release];
96  [_pendingRequest release];
97  [super dealloc];
98 }
99 
100 @end
_restorationEnabled
BOOL _restorationEnabled
Definition: FlutterRestorationPlugin.mm:18
FlutterMethodChannel
Definition: FlutterChannels.h:220
FlutterMethodNotImplemented
FLUTTER_DARWIN_EXPORT NSObject const * FlutterMethodNotImplemented
FlutterRestorationPlugin.h
FlutterRestorationPlugin
Definition: FlutterRestorationPlugin.h:12
+[FlutterStandardTypedData typedDataWithBytes:]
instancetype typedDataWithBytes:(NSData *data)
Definition: FlutterStandardCodec.mm:146
FLUTTER_ASSERT_NOT_ARC
#define FLUTTER_ASSERT_NOT_ARC
Definition: FlutterMacros.h:45
-[FlutterMethodChannel setMethodCallHandler:]
void setMethodCallHandler:(FlutterMethodCallHandler _Nullable handler)
FlutterMethodCall
Definition: FlutterCodecs.h:220
FlutterResult
void(^ FlutterResult)(id _Nullable result)
Definition: FlutterChannels.h:194
FlutterStandardTypedData
Definition: FlutterCodecs.h:300
FlutterStandardTypedData::data
NSData * data
Definition: FlutterCodecs.h:344
FlutterMethodCall::arguments
id arguments
Definition: FlutterCodecs.h:238