【发布时间】:2021-05-18 20:23:55
【问题描述】:
我正在开发一个具有多个小部件('星期一'、'星期二'等)的屏幕的计划应用程序。当我点击一个小部件时,我应该能够在弹出屏幕上使用 TextField 并进行导航文本到我点击的小部件。现在的问题是提供者同时将文本导航到所有小部件,而不是我点击的一个。我怎么能解决这个问题?感谢您的帮助
这是一个计划屏幕
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:my_planner_app/weekday_card.dart';
class PlannerScreen extends StatefulWidget {
static const String id = 'planner_screen';
@override
_PlannerScreenState createState() => _PlannerScreenState();
}
class _PlannerScreenState extends State<PlannerScreen>
with SingleTickerProviderStateMixin {
AnimationController controller;
Animation animation;
@override
void initState() {
super.initState();
controller =
AnimationController(duration: Duration(seconds: 3), vsync: this);
animation = ColorTween(begin: Colors.grey[800], end: Colors.white)
.animate(controller);
controller.forward();
controller.addListener(() {
setState(() {});
});
}
Widget build(BuildContext context) {
var size = MediaQuery.of(context).size;
final double itemHeight = (size.height - 24) / 2;
final double itemWidth = size.width / 2;
return Scaffold(
backgroundColor: Color(0xFFcf9e9f),
body: Container(
child: GridView(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
childAspectRatio: (itemWidth / itemHeight),
),
children: <Widget>[
WeekDayCard(
text: '',
),
WeekDayCard(text: 'Monday'),
WeekDayCard(text: 'Tuesday'),
WeekDayCard(text: 'Wednesday'),
WeekDayCard(text: 'Thursday'),
WeekDayCard(text: 'Friday'),
WeekDayCard(text: 'Saturday'),
WeekDayCard(text: 'Sunday'),
WeekDayCard(text: 'Notes'),
],
),
),
);
}
}
这是关联的小部件
import 'package:flutter/material.dart';
import 'package:my_planner_app/screens/addPlan_screen.dart';
import 'package:provider/provider.dart';
import 'package:my_planner_app/widgets/plan_widget.dart';
class WeekDayCard extends StatelessWidget {
WeekDayCard({@required this.text, this.name});
final String name;
final String text;
@override
Widget build(BuildContext context) {
return Consumer<MyProvider>(builder: (context, myProvider, child) {
return Card(
color: Color(0xFFFEEFCD),
elevation: 10,
child: Column(
children: [
Text(text),
Text(Provider.of<MyProvider>(context).name),
Expanded(
child: InkWell(
onTap: () {
showModalBottomSheet(
backgroundColor: Color(0xFFFEEFCD),
context: context,
builder: (context) => AddPlanScreen(),
);
},
),
),
],
),
);
});
}
}
这是关联弹出的AddScreen
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:my_planner_app/widgets/plan_widget.dart';
class AddPlanScreen extends StatelessWidget {
static String name;
@override
Widget build(BuildContext context) {
return Column(
children: [
Expanded(
child: TextFormField(
onChanged: (text) {
name = text;
},
decoration: InputDecoration(
border: InputBorder.none,
),
minLines: 10,
maxLines: 30,
autocorrect: false,
),
),
FlatButton(
onPressed: () {
print(name);
Provider.of<MyProvider>(context, listen: false).setName(name);
},
color: Colors.blue,
),
],
);
}
}
提供者
import 'package:flutter/material.dart';
class MyProvider extends ChangeNotifier {
String _name = '';
String get name => _name;
void setName(String newString) {
_name = newString;
print(_name);
notifyListeners();
}
}
ChangeNotifierProvider 放在 MaterialApp 之前
void main() {
runApp(MyPlanner());
}
class MyPlanner extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (context) => MyProvider(),
child: MaterialApp(
theme: ThemeData(fontFamily: 'IndieFlower'),
initialRoute: WelcomeScreen.id,
routes: {
WelcomeScreen.id: (context) => WelcomeScreen(),
RegisterScreen.id: (context) => RegisterScreen(),
LogInScreen.id: (context) => LogInScreen(),
PlannerScreen.id: (context) => PlannerScreen(),
},
),
);
}
}
【问题讨论】:
-
如果您提供的代码示例是独立的,会更容易提供帮助。 (⇒AddPlanScreen)
-
@Thierry 谢谢,添加了单独的代码。对不起,我是新来的,仍然需要学习如何更好地格式化
标签: flutter dart flutter-provider