在程序开始时使用持久性 cookie 初始化 Dio
Initialize Dio with persistent cookie at the start of the program
我在我的应用程序中使用 Dio,我希望它保存 cookie。事实证明我必须下载三个额外的包才能做到这一点:cookie_jar、dio_cookie_manager 和 path_provider.
我需要:
获取申请文件目录:
Directory docDir = await getApplicationDocumentsDirectory();
传递给 PersistCookieJar
PersistCookieJar(storage: FileStorage(appDocDir.path + '/.cookies/'));
并将其添加到拦截器中:
dio.interceptors.add(CookieManager(_cookieJar));
我的问题出在第一部分。出于某种原因,getApplicationDocumentsDirectory();
未在 StatefulWidget 小部件内使用时会引发错误。
我有两个问题:
- 为什么获取路径需要 StatefulWidget?
- 我怎样才能做我想做的事?我需要尽早初始化 Dio,以便在 UI 加载时,用户已经(或几乎)登录。另外,我不想将启动客户端对象的逻辑放在里面UI 代码,例如,它可能会在创建小部件时多次启动。
我的代码现在的样子:
Future<void> initStuff() async {
initLocator();
Directory docDir = await getApplicationDocumentsDirectory(); // throws
print('docDir = ${docDir.path}');
Client cli = Client(docDir);
locator.registerSingleton<Client>(cli);
// ...
}
void main() async {
await initStuff();
runApp(MyApp());
}
客户端构造函数:
Client(Directory appDocDir) {
final _cookieJar = PersistCookieJar(storage: FileStorage(appDocDir.path + '/.cookies/'));
dio = Dio()
..options.baseUrl = Utils.SERVER_ADDRESS
..options.sendTimeout = 5000
..options.receiveTimeout = 5000
..options.connectTimeout = 5000
..interceptors.add(CookieManager(_cookieJar));
}
我遇到的错误:
E/flutter (24953): [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: Null check operator used on a null value
E/flutter (24953): #0 MethodChannel.binaryMessenger
package:flutter/…/services/platform_channel.dart:142
E/flutter (24953): #1 MethodChannel._invokeMethod
package:flutter/…/services/platform_channel.dart:148
E/flutter (24953): #2 MethodChannel.invokeMethod
package:flutter/…/services/platform_channel.dart:331
E/flutter (24953): #3 MethodChannelPathProvider.getApplicationDocumentsPath
package:path_provider_platform_interface/src/method_channel_path_provider.dart:50
E/flutter (24953): #4 getApplicationDocumentsDirectory
package:path_provider/path_provider.dart:138
E/flutter (24953): #5 initStuff
package:proj/main.dart:20
E/flutter (24953): #6 main
package:proj/main.dart:63
E/flutter (24953): #7 _runMainZoned.<anonymous closure>.<anonymous closure> (dart:ui/hooks.dart:142:25)
E/flutter (24953): #8 _rootRun (dart:async/zone.dart:1354:13)
E/flutter (24953): #9 _CustomZone.run (dart:async/zone.dart:1258:19)
E/flutter (24953): #10 _runZoned (dart:async/zone.dart:1789:10)
E/flutter (24953): #11 runZonedGuarded (dart:async/zone.dart:1777:12)
E/flutter (24953): #12 _runMainZoned.<anonymous closure> (dart:ui/hooks.dart:138:5)
E/flutter (24953): #13 _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:283:19)
E/flutter (24953): #14 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:184:12)
好的:感谢您更新 post。
错误是:Unhandled Exception: Null check operator used on a null value
它来自第 3 方库调用 getApplicationDocumentsDirectory(),它的发生是因为您正在调用启用了空安全的(当前未初始化的)值(好东西!)。
建议:
使用 StatefulWidget 需要更多工作 - 但在这里很有意义。它也恰好为您解决了问题,对吗?
您可以尝试使 docDir 可为空(例如 String? path
)。这正是 getApplicationDocument 页面显示的内容:
Future<Directory> getApplicationDocumentsDirectory() async {
final String? path = await _platform.getApplicationDocumentsPath();
if (path == null) {
throw MissingPlatformDirectoryException(
'Unable to get application documents directory');
}
return Directory(path);
}
- 最后,查看这些链接:
运行 在 main() 中的这个在其他一切之前:
WidgetsFlutterBinding.ensureInitialized();
我在我的应用程序中使用 Dio,我希望它保存 cookie。事实证明我必须下载三个额外的包才能做到这一点:cookie_jar、dio_cookie_manager 和 path_provider.
我需要:
获取申请文件目录:
Directory docDir = await getApplicationDocumentsDirectory();
传递给 PersistCookieJar
PersistCookieJar(storage: FileStorage(appDocDir.path + '/.cookies/'));
并将其添加到拦截器中:
dio.interceptors.add(CookieManager(_cookieJar));
我的问题出在第一部分。出于某种原因,getApplicationDocumentsDirectory();
未在 StatefulWidget 小部件内使用时会引发错误。
我有两个问题:
- 为什么获取路径需要 StatefulWidget?
- 我怎样才能做我想做的事?我需要尽早初始化 Dio,以便在 UI 加载时,用户已经(或几乎)登录。另外,我不想将启动客户端对象的逻辑放在里面UI 代码,例如,它可能会在创建小部件时多次启动。
我的代码现在的样子:
Future<void> initStuff() async {
initLocator();
Directory docDir = await getApplicationDocumentsDirectory(); // throws
print('docDir = ${docDir.path}');
Client cli = Client(docDir);
locator.registerSingleton<Client>(cli);
// ...
}
void main() async {
await initStuff();
runApp(MyApp());
}
客户端构造函数:
Client(Directory appDocDir) {
final _cookieJar = PersistCookieJar(storage: FileStorage(appDocDir.path + '/.cookies/'));
dio = Dio()
..options.baseUrl = Utils.SERVER_ADDRESS
..options.sendTimeout = 5000
..options.receiveTimeout = 5000
..options.connectTimeout = 5000
..interceptors.add(CookieManager(_cookieJar));
}
我遇到的错误:
E/flutter (24953): [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: Null check operator used on a null value
E/flutter (24953): #0 MethodChannel.binaryMessenger
package:flutter/…/services/platform_channel.dart:142
E/flutter (24953): #1 MethodChannel._invokeMethod
package:flutter/…/services/platform_channel.dart:148
E/flutter (24953): #2 MethodChannel.invokeMethod
package:flutter/…/services/platform_channel.dart:331
E/flutter (24953): #3 MethodChannelPathProvider.getApplicationDocumentsPath
package:path_provider_platform_interface/src/method_channel_path_provider.dart:50
E/flutter (24953): #4 getApplicationDocumentsDirectory
package:path_provider/path_provider.dart:138
E/flutter (24953): #5 initStuff
package:proj/main.dart:20
E/flutter (24953): #6 main
package:proj/main.dart:63
E/flutter (24953): #7 _runMainZoned.<anonymous closure>.<anonymous closure> (dart:ui/hooks.dart:142:25)
E/flutter (24953): #8 _rootRun (dart:async/zone.dart:1354:13)
E/flutter (24953): #9 _CustomZone.run (dart:async/zone.dart:1258:19)
E/flutter (24953): #10 _runZoned (dart:async/zone.dart:1789:10)
E/flutter (24953): #11 runZonedGuarded (dart:async/zone.dart:1777:12)
E/flutter (24953): #12 _runMainZoned.<anonymous closure> (dart:ui/hooks.dart:138:5)
E/flutter (24953): #13 _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:283:19)
E/flutter (24953): #14 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:184:12)
好的:感谢您更新 post。
错误是:Unhandled Exception: Null check operator used on a null value
它来自第 3 方库调用 getApplicationDocumentsDirectory(),它的发生是因为您正在调用启用了空安全的(当前未初始化的)值(好东西!)。
建议:
使用 StatefulWidget 需要更多工作 - 但在这里很有意义。它也恰好为您解决了问题,对吗?
您可以尝试使 docDir 可为空(例如
String? path
)。这正是 getApplicationDocument 页面显示的内容:
Future<Directory> getApplicationDocumentsDirectory() async { final String? path = await _platform.getApplicationDocumentsPath(); if (path == null) { throw MissingPlatformDirectoryException( 'Unable to get application documents directory'); } return Directory(path); }
- 最后,查看这些链接:
运行 在 main() 中的这个在其他一切之前:
WidgetsFlutterBinding.ensureInitialized();