公式に書かれている通りに実装したけど、 AndroidやiPhoneでは機能するのにiPadでは機能しない。
しかも長文の謎のエラーを吐く。
[LayoutConstraints] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSAutoresizingMaskLayoutConstraint:0x2819a8190 h=-&- v=--& _UIActivityContentNavigationBar:0x101baec40.minY == 0 (active, names: '|':UILayoutContainerView:0x101bc5cf0 )>",
"<NSAutoresizingMaskLayoutConstraint:0x2819a92c0 h=-&- v=--& _UIActivityContentNavigationBar:0x101baec40.height == 50 (active)>",
"<NSLayoutConstraint:0x2819b9130 V:[_UIActivityContentNavigationBar:0x101baec40]-(0)-[UIFocusContainerGuide:0x28053e850'UINavigationControllerContentFocusContainerGuide'] (active)>",
"<NSLayoutConstraint:0x2819b9b80 UIFocusContainerGuide:0x28053e850'UINavigationControllerContentFocusContainerGuide'.bottom == UILayoutContainerView:0x101bc5cf0.bottom (active)>",
"<NSLayoutConstraint:0x2819ba670 V:|-(0)-[UILayoutContainerView:0x101bc5cf0] (active, names: '|':UIView:0x101b93700 )>",
"<NSLayoutConstraint:0x2819ba580 UILayoutContainerView:0x101bc5cf0.bottom == UIView:0x101b93700.bottom (active)>",
"<NSLayoutConstraint:0x281929090 'UIView-Encapsulated-Layout-Height' UIView:0x101b93700.height == 0 (active)>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x2819b9130 V:[_UIActivityContentNavigationBar:0x101baec40]-(0)-[UIFocusContainerGuide:0x28053e850'UINavigationControllerContentFocusContainerGuide'] (active)>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
[Default] Task Runner[2128]/1#4 LF=0 couldn't find entitlement CopresenceCore.Entitlement.publicAPI error nil
[LayoutConstraints] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0x281939310 H:|-(0)-[_UIActivityContentTitleView:0x12a955830] (active, names: '|':_UINavigationBarContentView:0x101b90150 )>",
"<NSLayoutConstraint:0x281938190 _UIActivityContentTitleView:0x12a955830.trailing == _UINavigationBarContentView:0x101b90150.trailing (active)>",
"<NSLayoutConstraint:0x28192bd40 LPLinkView:0x101a0e510.leading == UILayoutGuide:0x28030dea0'UIViewLayoutMarginsGuide'.leading (active)>",
"<NSLayoutConstraint:0x28192b840 LPLinkView:0x101a0e510.trailing == UILayoutGuide:0x28030dea0'UIViewLayoutMarginsGuide'.trailing (active)>",
"<NSLayoutConstraint:0x281954370 'UIView-Encapsulated-Layout-Width' _UINavigationBarContentView:0x101b90150.width == 0 (active)>",
"<NSLayoutConstraint:0x2819349b0 'UIView-leftMargin-guide-constraint' H:|-(16)-[UILayoutGuide:0x28030dea0'UIViewLayoutMarginsGuide'](LTR) (active, names: '|':_UIActivityContentTitleView:0x12a955830 )>",
"<NSLayoutConstraint:0x28192a0d0 'UIView-rightMargin-guide-constraint' H:[UILayoutGuide:0x28030dea0'UIViewLayoutMarginsGuide']-(8)-|(LTR) (active, names: '|':_UIActivityContentTitleView:0x12a955830 )>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x28192b840 LPLinkView:0x101a0e510.trailing == UILayoutGuide:0x28030dea0'UIViewLayoutMarginsGuide'.trailing (active)>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
解決策
そして辿り着いたのがこのissueページ
https://github.com/flutter/flutter/issues/47220
final shareBtnKey = GlobalKey();
void shareFile() {
Share.shareFiles(
...
sharePositionOrigin: shareButtonRect(),
);
}
Rect shareButtonRect() {
RenderBox renderBox = shareBtnKey.currentContext?.findRenderObject() as RenderBox;
Size size = renderBox.size;
Offset position = renderBox.localToGlobal(Offset.zero);
return Rect.fromCenter(
center: position + Offset(size.width / 2, size.height / 2),
width: size.width,
height: size.height,
);
}
公式に書いてあるのとは違って、僕はこれで動きました。
shareBtnKeyは共有ボタンのkeyとしてセットしてお使いください。
時間をだいぶ無駄にしましたが、先人の知恵に救われました。