Как использовать этот метод в глобальном масштабе? - PullRequest
0 голосов
/ 05 июня 2019

Я проверил, подключен ли телефон к интернетуЯ использовал этот способ.Это работает очень хорошо.Но я использовал этот способ на всех занятиях.тот же код дублируется.Я не понимаю, как использовать этот вид кода в глобальном.

инициализировать переменную

bool isOffline = false;

initState

  @override
  void initState() {
    ConnectionStatusSingleton connectionStatus =
        ConnectionStatusSingleton.getInstance();// connectionStatusSingleton is another class
    _connectionChangeStream =
        connectionStatus.connectionChange.listen(connectionChanged);
    connectionChanged(connectionStatus.hasConnection);
    super.initState();
  }

метод connectionChanged

void connectionChanged(dynamic hasConnection) {
    setState(() {
      isOffline = !hasConnection;
    });
  }

После этого я использовал в виджете Если соединение не доступно, я отображал appBar,

  appBar: isOffline
      ? PreferredSize(
    preferredSize: Size.fromHeight(20.0),
    child: AppBar(
      leading: Container(),
      centerTitle: true,
      backgroundColor: Colors.red,
      title: Text(
        AppTranslations.of(context).text("connection_drop"),
        style: TextStyle(fontSize: 15.0, color: Colors.white),
      ),
    ),
  )
      : null,

1 Ответ

1 голос
/ 05 июня 2019

Вы можете использовать StreamBuilder для достижения этой цели.Просто оберните виджеты, которые зависят от этого Stream, с ним.

Примерно так:

void main() {
  runApp(App());
}

class App extends StatelessWidget {
  const App({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: StreamBuilder<ConnectivityResult>(
            stream: Connectivity().onConnectivityChanged,
            initialData: ConnectivityResult.none,
            builder: (context, snapshot) {
              switch (snapshot.data) {
                case ConnectivityResult.wifi:
                  return Text("we're on a wifi network");
                case ConnectivityResult.mobile:
                  return Text("we're on a mobile network");
                case ConnectivityResult.none:
                  return Text('no network connection');
              }
            },
          ),
        ),
      ),
    );
  }
}

Кроме того, вы можете взглянуть на https://pub.dev/packages/connectivityи https://pub.dev/packages/data_connection_checker

Чтобы повторно использовать виджет AppBar, вы можете извлечь его в своем собственном классе:

class MyAppBar extends StatelessWidget {
  ...
  @override
  Widget build(BuildContext context) {
    return AppBar(
      title: StreamBuilder<ConnectivityResult>(
        ...
      ),
    );
  }
  ...
}

// every time you need it, just pass it as an argument to the `Scaffold`'s `appBar` parameter.

...
Scaffold(
  ...
  appbar: MyAppBar();
  ...
)
...

Редактировать: я улучшил пример кода с тем, что действительно работает.

...