我有一个主导航器可以推送其他子导航器,但是如果我从子导航器推送路线,在 iOS 上,当我从打开的小部件向后滑动时,它会返回到主导航器根,而不是转到子小部件的根,那么我如何首先使用滑动手势处理子导航器的历史记录,并仅当我在子导航器的根上(如单个导航器)时才允许返回主导航器?
这是主导航器:
class MenuNavigator extends StatelessWidget {
final GlobalKey<NavigatorState> navigatorKey;
const MenuNavigator({Key key, this.navigatorKey}) : super(key: key);
WidgetBuilder routeBuilder(
RouteSettings routeSettings, GetUserResponse userResponse) {
switch (routeSettings.name) {
case MenuNavigatorRoutes.root:
return (context) => MenuPage();
case MenuNavigatorRoutes.documents:
return (context) => DocumentsNavigator();
case MenuNavigatorRoutes.requests:
return (context) => RequestsNavigator();
default:
return null;
}
}
@override
Widget build(BuildContext context) {
return Navigator(
key: navigatorKey,
initialRoute: MenuNavigatorRoutes.root,
onGenerateRoute: (routeSettings) {
return MaterialPageRoute(
settings: routeSettings,
builder: (context) =>
routeBuilder(routeSettings, userResponse)(context));
},
);
}
}
Run Code Online (Sandbox Code Playgroud)
DocumentsNavigator …
我需要将iPhone / iPad上的mp4视频文件上传到服务器(也在后台),所以我读到可以通过URLSession.uploadTask(with:URLRequest,fromFile:URL)方法来实现,但我不知道该怎么做我之前准备了请求,我需要创建一个multipart / form-data请求,因为我想附加其他字符串参数。
func requestBodyFor(video: URL) -> Data? {
let url = URL(string: "url_of_upload_handler.php")!
let parameters = ["type":"video", "user":"112"]
do {
let kBoundary = "Boundary-\(UUID().uuidString)"
let kStartTag = "--%@\r\n"
let kEndTag = "\r\n"
let kContent = "Content-Disposition: form-data; name=\"%@\"\r\n\r\n"
var body = Data()
let videoData = try Data(contentsOf: video)
// parameters
for (key,value) in parameters {
body.append(String(format: kStartTag, kBoundary).data(using: String.Encoding.utf8)!)
body.append(String(format: kContent, key).data(using: String.Encoding.utf8)!)
body.append(value.data(using: String.Encoding.utf8)!)
body.append(String(format: kEndTag).data(using: String.Encoding.utf8)!)
}
//Video data
body.append(String(format: kStartTag, boundary).data(using: String.Encoding.utf8)!) …Run Code Online (Sandbox Code Playgroud)