So I'm working on a NewsApp and I could successfully manage to fetch data and display it, however the search function wasn't working! yesterday it just stuck with that error! I've every solution that I came across SOF and git but ended with failure. I provide images of every related code below. please, help
- base URL: https://newsapi.org/
- method : v2/top-headlines?
- queries : country=us&category=business&apiKey=65f7f556ec76449fa7dc7c0069f040ca
for search purpose: https://newsapi.org/v2/everything?q=tesla&apiKey=65f7f556ec76449fa7dc7c0069f040ca
DioError [DioErrorType.other]: SocketException: Failed host lookup: 'newsapi.orgv2' (OS Error: No address associated with hostname, errno = 7)
dio code
class DioHelper {
static late Dio dio;
static init() {
dio = Dio(
BaseOptions(
baseUrl: 'https://newsapi.org',
receiveDataWhenStatusError: true,
),
);
}
static Future<Response> getData({
required String url,
required Map<String, dynamic> query,
}) async {
return await dio.get(
url,
queryParameters: query,
);
}
}
Cubit code
class NewsCubit extends Cubit<NewsStates> {
NewsCubit() : super(NewsInitialStates());
static NewsCubit get(context) => BlocProvider.of(context);
int currentindex = 0;
List<BottomNavigationBarItem> bottomItems = [
const BottomNavigationBarItem(
icon: Icon(Icons.add_business_outlined), label: 'Business'),
const BottomNavigationBarItem(
icon: Icon(Icons.sports_football_outlined), label: 'Sports'),
const BottomNavigationBarItem(
icon: Icon(Icons.science_outlined), label: 'Science'),
];
List<Widget> screens = [
const BusinessScreen(),
const SportsScreen(),
ScienceScreen(),
];
void changeBottomNavBar(int index) {
currentindex = index;
if (index == 1) getSports();
if (index == 2) getScience();
emit(NewsBottomNavState());
}
List<dynamic> business = [];
void getBusiness() {
emit(NewsGetBusinessLoadingState());
DioHelper.getData(
url: '/v2/top-headlines',
query: {
'country': 'eg',
'category': 'business',
'apiKey': '65f7f556ec76449fa7dc7c0069f040ca',
},
).then((value) {
// print(value.data['articles'][0]['title']);
business = value.data['articles'];
print(business[0]['title']);
emit(NewsGetBusinessSuccessState());
}).catchError((e) {
print(e.toString());
emit(NewsGetBusinessErrorState(e.toString()));
});
}
List<dynamic> sports = [];
void getSports() {//sports code just like business
}
List<dynamic> science = [];
void getScience() {//science code just like business
}
List<dynamic> search = [];
void getSearch(String value) {
emit(NewsGetSearchLoadingState());
search = [];
DioHelper.getData(
url: '/v2/everything',
query: {
'q': '$value',
'apiKey': '65f7f556ec76449fa7dc7c0069f040ca',
},
).then((value) {
// print(value.data['articles'][0]['title']);
search = value.data['articles'];
print(search[0]['title']);
emit(NewsGetSearchSuccessState());
}).catchError((e) {
print(e.toString());
emit(NewsGetSearchErrorState(e.toString()));
});
}
}
Main class
void main() async {
WidgetsFlutterBinding.ensureInitialized();
Bloc.observer = MyBlocObserver();
HttpOverrides.global = MyHttpOverrides();
DioHelper.init();
await CacheHelper.init();
bool? isDark = CacheHelper.getBoolean(key: 'isDark');
runApp(MyApp(isDark));
}
class MyApp extends StatelessWidget {
bool? isDark;
MyApp(this.isDark);
@override
Widget build(BuildContext context) {
return MultiBlocProvider(
providers: [
BlocProvider(
create: (context) => NewsCubit()
..getBusiness()
..getSports()
..getScience(),
),
BlocProvider(
create: (context) => AppCubit()
..ChangeAppMode(
fromShared: isDark,
),
)
],
child: BlocConsumer<AppCubit, AppState>(
listener: (context, state) {},
builder: (context, state) {
return MaterialApp(
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.deepOrange,
scaffoldBackgroundColor: Colors.white,
floatingActionButtonTheme: const FloatingActionButtonThemeData(
backgroundColor: Colors.deepOrangeAccent,
),
appBarTheme: const AppBarTheme(
titleSpacing: 20,
iconTheme: IconThemeData(
color: Colors.black,
),
// backwardsCompatibility: false,
systemOverlayStyle: SystemUiOverlayStyle(
statusBarColor: Colors.white,
statusBarIconBrightness: Brightness.dark,
),
backgroundColor: Colors.white,
elevation: 0.0,
titleTextStyle: TextStyle(
color: Colors.black,
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
bottomNavigationBarTheme: const BottomNavigationBarThemeData(
type: BottomNavigationBarType.fixed,
selectedItemColor: Colors.deepOrangeAccent,
unselectedItemColor: Colors.grey,
elevation: 50,
backgroundColor: Colors.white,
),
textTheme: const TextTheme(
bodyText1: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
color: Colors.black,
),
),
),
darkTheme: ThemeData(
scaffoldBackgroundColor: HexColor('333739'),
primarySwatch: Colors.deepOrange,
backgroundColor: Colors.white,
floatingActionButtonTheme: const FloatingActionButtonThemeData(
backgroundColor: Colors.deepOrangeAccent,
),
appBarTheme: AppBarTheme(
titleSpacing: 20,
iconTheme: const IconThemeData(
color: Colors.white,
),
// backwardsCompatibility: false,
systemOverlayStyle: SystemUiOverlayStyle(
statusBarColor: HexColor('333739'),
statusBarIconBrightness: Brightness.light,
),
backgroundColor: HexColor('333739'),
elevation: 0.0,
titleTextStyle: const TextStyle(
color: Colors.white,
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
bottomNavigationBarTheme: BottomNavigationBarThemeData(
type: BottomNavigationBarType.fixed,
selectedItemColor: Colors.deepOrangeAccent,
unselectedItemColor: Colors.grey,
elevation: 50,
backgroundColor: HexColor('333739'),
),
textTheme: const TextTheme(
bodyText1: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
color: Colors.white,
),
),
),
themeMode:
AppCubit.get(context).isDark ? ThemeMode.dark : ThemeMode.light,
home: Directionality(
child: NewsLayout(),
textDirection: TextDirection.ltr,
),
);
},
),
);
}
}
class MyHttpOverrides extends HttpOverrides {
@override
HttpClient createHttpClient(SecurityContext? context) {
return super.createHttpClient(context)
..badCertificateCallback =
(X509Certificate cert, String host, int port) => true;
}
}
CodePudding user response:
try to put / after org in your baseUrl
CodePudding user response:
i figure it out> just added connectTimeout, receiveTimeout in my Dio(baseoptions) and it worked for me!
class DioHelper {
static late Dio dio;
static init() {
BaseOptions options = BaseOptions(
baseUrl: baseUrl,
connectTimeout: 20 * 1000,
receiveTimeout: 20 * 1000,
receiveDataWhenStatusError: true,
);
dio = Dio(options);
}
static Future<List<dynamic>> getData(
{required Map<String, dynamic> query}) async {
try {
Response response =
await dio.get('v2/top-headlines', queryParameters: query);
return response.data['articles'];
} catch (e) {
print(e.toString());
return [];
}
}
}