我想创建(新闻应用程序),我在网站中有一个类别列表,我遵循了此文档,所以我需要将网站的类别添加到我的TabBar,就像这个图片一样:
我怎样才能做到这一点?
我想将方向从左到右更改为从右到左,我该怎么做?
代码:
Category Class:
import 'dart:async';
import 'dart:convert';
import 'package:http/http.dart' as http;
Future<Category> fetchCatgeory() async {
final response = await http.get("url");
if (response.statusCode == 200) {
return Category.fromJson(json.decode(response.body));
} else {
throw Exception('Failed to load category');
}
}
class Category {
final int id;
final String title;
Category({this.id, this.title});
factory Category.fromJson(Map<String, dynamic> json) {
return Category (
id: json['id'],
title: json['title'],
);
}
}
Run Code Online (Sandbox Code Playgroud)
HomePage Class:
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:munaw3_news/extra/json_file.dart';
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
final Future<Category> catg;
HomePage({Key key, this.catg}) : super(key: key);
}
class _HomePageState extends State<HomePage> {
_HomePageState();
int a = 0;
Future<Category> catg;
@override
void initState() {
// TODO: implement initState
super.initState();
catg = fetchCatgeory();
}
bool isPressed = false;
_pressed() {
var newVal = true;
if(isPressed) {
newVal = false;
} else {
newVal = true;
}
setState((){
isPressed = newVal;
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: DefaultTabController(
length: catg.toString().length,
child: Scaffold(
appBar: AppBar(
title: Image.asset('assets/logo.png', fit: BoxFit.cover,),
centerTitle: true,
backgroundColor: Colors.grey[900],
bottom: TabBar(
tabs: [
// Tab(text: catg[0],),
// Tab(text: catg[1],),
// Tab(text: catg[2],),
// Tab(text: catg[3],)
],
),
),
body: TabBarView(
children: [
// Tab(text: catg[0],),
// Tab(text: catg[1],),
// Tab(text: catg[2],),
// Tab(text: catg[3],)
],
),
bottomNavigationBar: BottomAppBar(
clipBehavior: Clip.antiAlias,
elevation: 0,
color: Colors.grey[900],
child: Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
Container(
height: 5,
width: double.infinity,
color: Colors.grey[900],
),
Padding(
padding: const EdgeInsets.only(left: 8, right: 8),
child: Container(
height: 60,
child: Align(
alignment: FractionalOffset.center,
child: new Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
IconButton(icon: Icon(Icons.info), color: Colors.grey[600], iconSize: 30,
disabledColor: Colors.white,
onPressed: a==3 ? null : () => setState(() {
a=3;
})),
IconButton(icon: Icon(Icons.local_mall), color: Colors.grey[600], iconSize: 30,
disabledColor: Colors.white,
onPressed: a==2 ? null : () => setState(() {
a=2;
})),
IconButton(icon: Icon(Icons.bookmark), color: Colors.grey[600], iconSize: 30,
disabledColor: Colors.white,
onPressed: a==1 ? null : () => setState(() {
a=1;
})),
IconButton(icon: Icon(Icons.home), color: Colors.grey[600], iconSize: 30,
disabledColor: Colors.white,
onPressed: a==0 ? null : () => setState(() {
a=0;
})),
],
),
),
),
),
],
),
),
),),
);
}
}
Run Code Online (Sandbox Code Playgroud)
我解决了这个问题,首先创建一个名为 it 的文件category.dart,然后在文件中创建一个类:
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
class Category {
int id;
String title;
Category({
this.id,
this.title,
});
static Future<List<Category>> getCategories() async {
http.Response response = await http.get("JSON API Url");
List<Category> list = [];
try {
if (response.statusCode == 200) {
Map<String, dynamic> map = json.decode(response.body);
for (var map in map['categories']) {
list.add(Category(id: map['id'], title: map['title']));
}
}
} catch (e, _) {
debugPrint(e.toString());
}
return list;
}
}
Run Code Online (Sandbox Code Playgroud)
并创建一个文件并将其命名为list_news.dart:
import 'package:flutter/material.dart';
import 'package:munaw3_app/model/category.dart';
class ListNews extends StatefulWidget {
ListNews({Key key}) : super(key: key);
@override
_ListNewsState createState() => _ListNewsState();
}
class _ListNewsState extends State<ListNews> {
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return FutureBuilder<List<Category>>(
future: Category.getCategories(), //NOT Recommended
builder: (c, s) {
if (s.hasData) {
List<Tab> tabs = new List<Tab>();
for (int i = 0; i < s.data.length; i++) {
tabs.add(Tab(
child: Text(
s.data[i].title,
style: TextStyle(color: Colors.white),
),
));
}
return DefaultTabController(
length: s.data.length,
child: Scaffold(
appBar: AppBar(
title: Image.asset('assets/logo.png', fit: BoxFit.cover),
backgroundColor: Colors.grey[900],
bottom: TabBar(
isScrollable: true,
tabs: tabs,
),
),
),
);
}
if (s.hasError) print(s.error.toString());
return Scaffold(
body: Center(
child: Text(s.hasError ? s.error.toString() : "Loading...")),
);
},
);
}
}
Run Code Online (Sandbox Code Playgroud)
最后,为了指导TabBar您应该更改应用程序的本地化以支持任何国家/地区并支持从右到左(RTL),首先转到pubspec.yaml(依赖项)中的新酒吧:
dependencies:
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
Run Code Online (Sandbox Code Playgroud)
最后返回main.dart文件并添加以下代码:
import 'package:flutter/material.dart';
import 'package:munaw3_app/views/list_news.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
void main() => runApp(MaterialApp(
localizationsDelegates: [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
supportedLocales: [const Locale("ar", "AE")], // Here you can add any language you need
home: ListNews(),
));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8388 次 |
| 最近记录: |