如何导出和使用全局变量

时间:2019-06-27 08:09:10

标签: flutter dart

我正在创建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函数应自动执行。

1 个答案:

答案 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();
  }
);