【问题标题】:Flutter crash when theres no internet没有互联网时 Flutter 崩溃
【发布时间】:2020-06-07 10:01:27
【问题描述】:

每当我禁用互联网连接时,我的应用程序(字面意思是从 here 获取)崩溃,就像互联网的魅力一样。我怎样才能仍然能够访问页面,显示最后访问的结果而不会卡住?我拥有清单中包含的所有互联网权限。

<uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

这是代码

import 'dart:async';
import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;

Future<Album> fetchAlbum() async {
  final response =
      await http.get('https://jsonplaceholder.typicode.com/albums/1');

  if (response.statusCode == 200) {
    // If the server did return a 200 OK response, then parse the JSON.
    return Album.fromJson(json.decode(response.body));
  } else {
    // If the server did not return a 200 OK response, then throw an exception.
    throw Exception('Failed to load album');
  }
}

class Album {
  final int userId;
  final int id;
  final String title;

  Album({this.userId, this.id, this.title});

  factory Album.fromJson(Map<String, dynamic> json) {
    return Album(
      userId: json['userId'],
      id: json['id'],
      title: json['title'],
    );
  }
}

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  MyApp({Key key}) : super(key: key);

  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
Future<Album> futureAlbum;

  @override
  void initState() {
    super.initState();
    futureAlbum = fetchAlbum();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Fetch Data Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Fetch Data Example'),
        ),
        body: Center(
          child: FutureBuilder<Album>(
            future: futureAlbum,
            builder: (context, snapshot) {
              if (snapshot.hasData) {
                return Text(snapshot.data.title);
              } else if (snapshot.hasError) {
                return Text("${snapshot.error}");
              }

              // By default, show a loading spinner.
              return CircularProgressIndicator();
            },
          ),
        ),
      ),
    );
  }
}

谢谢

【问题讨论】:

    标签: api http flutter connectivity


    【解决方案1】:

    你可以使用connectivity library监听wifi状态

    import 'package:connectivity/connectivity.dart';
    
    @override
    initState() {
      super.initState();
    
      subscription = Connectivity().onConnectivityChanged.listen((ConnectivityResult result) {
        // Got a new connectivity status!
      })
    }
    
    // Be sure to cancel subscription after you are done
    @override
    dispose() {
      super.dispose();
    
      subscription.cancel();
    }
    

    【讨论】:

    • 应用仍然崩溃
    【解决方案2】:

    在发出任何 HTTP 请求之前,使用连接库检查网络状态。

    【讨论】:

    • 应用程序崩溃并卡住(必须强制关闭),我收到此崩溃消息:'发生异常。 SocketException (SocketException: Failed host lookup: 'jsonplaceholder.typicode.com' (OS Error: No address associated with hostname, errno = 7))',在有网络连接时工作正常
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    相关资源
    最近更新 更多