我正在创建Flutter应用,并且我需要一个具有一些设置的全局http客户端。
颤振:1.5.4 飞镖:2.3.2
// utils/http.dart
import 'dart:io';
import 'package:cookie_jar/cookie_jar.dart';
import 'package:dio/dio.dart';
import 'package:path_provider/path_provider.dart';
Dio http = Dio();
void main() async {
// Save cookies to cookie jar.
Directory appDir = await getApplicationDocumentsDirectory();
http.interceptors.add(CookieManager(PersistCookieJar(dir: appDir.path)));
}
// main.dart
import 'package:flutter/material.dart';
import 'app.dart';
import 'utils/http.dart';
void main() {
print(http.interceptors); // returns []
runApp(App());
}
我希望http中的main
函数应自动执行。
答案 0 :(得分:0)
对此的常见解决方案是将其包装在Widget中并将该Widget放置在Widget Tree中。在树的高处,因此有点像全局。这叫做“提升状态”。
Flutter的开箱即用解决方案是InheritedWidget
。值得一看和理解,因为大多数第三方解决方案都依赖它。
为了使生活更轻松一点,我使用了pacakge:provider。代码如下所示:
Provider<Dio>(
builder: (_) => Dio(),
child: MaterialApp(/*...*/)
);
稍后在小部件树中:
Consumer<Dio>(
builder: (ctx, dio, _) {
// widget builder method
debugPrint('Dio instance: ${dio}');
return Container();
}
);